From 6005a1c2b2abba919cc660dc2fd2a5fc0becbbd6 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Fri, 5 Aug 2016 10:32:13 +1200 Subject: [PATCH] API Upgrade for silverstripe CMS namespace changes --- ORM/Connect/MySQLDatabase.php | 83 ++++++++++++------- ORM/Versioning/ChangeSet.php | 2 +- Security/Member.php | 5 +- Security/Security.php | 4 +- admin/client/dist/js/bundle-framework.js | 6 +- .../CampaignAdmin/CampaignAdminList.js | 2 +- admin/code/CMSBatchAction.php | 2 +- admin/code/CMSBatchActionHandler.php | 4 +- admin/code/CMSMenu.php | 3 +- admin/code/LeftAndMain.php | 68 +++++++++------ admin/code/ModelAdmin.php | 1 + core/ClassInfo.php | 10 ++- dev/SapphireTest.php | 7 +- filesystem/AssetControlExtension.php | 5 -- forms/TreeDropdownField.php | 2 +- forms/htmleditor/HTMLEditorField.php | 2 +- search/FulltextSearchable.php | 25 +++--- tests/control/RequestHandlingTest.php | 6 +- tests/filesystem/FileTest.php | 6 +- view/ViewableData.php | 3 + 20 files changed, 153 insertions(+), 93 deletions(-) diff --git a/ORM/Connect/MySQLDatabase.php b/ORM/Connect/MySQLDatabase.php index e747f62f2..8c3c98f3f 100644 --- a/ORM/Connect/MySQLDatabase.php +++ b/ORM/Connect/MySQLDatabase.php @@ -3,11 +3,14 @@ namespace SilverStripe\ORM\Connect; use Config; +use Convert; use Exception; use PaginatedList; use SilverStripe\Framework\Core\Configurable; use SilverStripe\ORM\DataList; use SilverStripe\ORM\ArrayList; +use SilverStripe\ORM\DataObject; +use SilverStripe\ORM\Queries\SQLSelect; /** * MySQL connector class. @@ -101,39 +104,60 @@ class MySQLDatabase extends SS_Database { * The core search engine, used by this class and its subclasses to do fun stuff. * Searches both SiteTree and File. * + * @param array $classesToSearch * @param string $keywords Keywords as a string. + * @param int $start + * @param int $pageLength + * @param string $sortBy + * @param string $extraFilter + * @param bool $booleanSearch + * @param string $alternativeFileFilter + * @param bool $invertedMatch + * @return PaginatedList + * @throws Exception */ public function searchEngine($classesToSearch, $keywords, $start, $pageLength, $sortBy = "Relevance DESC", $extraFilter = "", $booleanSearch = false, $alternativeFileFilter = "", $invertedMatch = false ) { - if (!class_exists('SiteTree')) - throw new Exception('MySQLDatabase->searchEngine() requires "SiteTree" class'); - if (!class_exists('File')) - throw new Exception('MySQLDatabase->searchEngine() requires "File" class'); + $pageClass = 'SilverStripe\\CMS\\Model\\SiteTree'; + $fileClass = 'File'; + $pageTable = DataObject::getSchema()->tableName($pageClass); + $fileTable = DataObject::getSchema()->tableName($fileClass); + if (!class_exists($pageClass)) { + throw new Exception('MySQLDatabase->searchEngine() requires "SiteTree" class'); + } + if (!class_exists($fileClass)) { + throw new Exception('MySQLDatabase->searchEngine() requires "File" class'); + } $keywords = $this->escapeString($keywords); $htmlEntityKeywords = htmlentities($keywords, ENT_NOQUOTES, 'UTF-8'); - $extraFilters = array('SiteTree' => '', 'File' => ''); + $extraFilters = array($pageClass => '', $fileClass => ''); - if ($booleanSearch) $boolean = "IN BOOLEAN MODE"; + if ($booleanSearch) { + $boolean = "IN BOOLEAN MODE"; + } if ($extraFilter) { - $extraFilters['SiteTree'] = " AND $extraFilter"; + $extraFilters[$pageClass] = " AND $extraFilter"; - if ($alternativeFileFilter) - $extraFilters['File'] = " AND $alternativeFileFilter"; - else $extraFilters['File'] = $extraFilters['SiteTree']; + if ($alternativeFileFilter) { + $extraFilters[$fileClass] = " AND $alternativeFileFilter"; + } else { + $extraFilters[$fileClass] = $extraFilters[$pageClass]; + } } // Always ensure that only pages with ShowInSearch = 1 can be searched - $extraFilters['SiteTree'] .= " AND ShowInSearch <> 0"; + $extraFilters[$pageClass] .= " AND ShowInSearch <> 0"; // File.ShowInSearch was added later, keep the database driver backwards compatible // by checking for its existence first - $fields = $this->fieldList('File'); - if (array_key_exists('ShowInSearch', $fields)) - $extraFilters['File'] .= " AND ShowInSearch <> 0"; + $fields = $this->getSchemaManager()->fieldList($fileTable); + if (array_key_exists('ShowInSearch', $fields)) { + $extraFilters[$fileClass] .= " AND ShowInSearch <> 0"; + } $limit = $start . ", " . (int) $pageLength; @@ -141,27 +165,28 @@ class MySQLDatabase extends SS_Database { ? "NOT " : ""; if ($keywords) { - $match['SiteTree'] = " + $match[$pageClass] = " MATCH (Title, MenuTitle, Content, MetaDescription) AGAINST ('$keywords' $boolean) + MATCH (Title, MenuTitle, Content, MetaDescription) AGAINST ('$htmlEntityKeywords' $boolean) "; - $match['File'] = "MATCH (Name, Title) AGAINST ('$keywords' $boolean) AND ClassName = 'File'"; + $fileClassSQL = Convert::raw2sql($fileClass); + $match[$fileClass] = "MATCH (Name, Title) AGAINST ('$keywords' $boolean) AND ClassName = '$fileClassSQL'"; // We make the relevance search by converting a boolean mode search into a normal one $relevanceKeywords = str_replace(array('*', '+', '-'), '', $keywords); $htmlEntityRelevanceKeywords = str_replace(array('*', '+', '-'), '', $htmlEntityKeywords); - $relevance['SiteTree'] = "MATCH (Title, MenuTitle, Content, MetaDescription) " + $relevance[$pageClass] = "MATCH (Title, MenuTitle, Content, MetaDescription) " . "AGAINST ('$relevanceKeywords') " . "+ MATCH (Title, MenuTitle, Content, MetaDescription) AGAINST ('$htmlEntityRelevanceKeywords')"; - $relevance['File'] = "MATCH (Name, Title) AGAINST ('$relevanceKeywords')"; + $relevance[$fileClass] = "MATCH (Name, Title) AGAINST ('$relevanceKeywords')"; } else { - $relevance['SiteTree'] = $relevance['File'] = 1; - $match['SiteTree'] = $match['File'] = "1 = 1"; + $relevance[$pageClass] = $relevance[$fileClass] = 1; + $match[$pageClass] = $match[$fileClass] = "1 = 1"; } // Generate initial DataLists and base table names $lists = array(); - $baseClasses = array('SiteTree' => '', 'File' => ''); + $baseClasses = array($pageClass => '', $fileClass => ''); foreach ($classesToSearch as $class) { $lists[$class] = DataList::create($class)->where($notMatch . $match[$class] . $extraFilters[$class], ""); $baseClasses[$class] = '"' . $class . '"'; @@ -171,19 +196,19 @@ class MySQLDatabase extends SS_Database { // Make column selection lists $select = array( - 'SiteTree' => array( - "ClassName", "$baseClasses[SiteTree].\"ID\"", "ParentID", + $pageClass => array( + "ClassName", "{$pageTable}.\"ID\"", "ParentID", "Title", "MenuTitle", "URLSegment", "Content", "LastEdited", "Created", "Name" => "_{$charset}''", - "Relevance" => $relevance['SiteTree'], "CanViewType" + "Relevance" => $relevance[$pageClass], "CanViewType" ), - 'File' => array( - "ClassName", "$baseClasses[File].\"ID\"", "ParentID", + $fileClass => array( + "ClassName", "{$fileTable}.\"ID\"", "ParentID", "Title", "MenuTitle" => "_{$charset}''", "URLSegment" => "_{$charset}''", "Content" => "_{$charset}''", "LastEdited", "Created", "Name", - "Relevance" => $relevance['File'], "CanViewType" => "NULL" + "Relevance" => $relevance[$fileClass], "CanViewType" => "NULL" ), ); @@ -192,10 +217,12 @@ class MySQLDatabase extends SS_Database { $queryParameters = array(); $totalCount = 0; foreach ($lists as $class => $list) { + $table = DataObject::getSchema()->tableName($class); + /** @var SQLSelect $query */ $query = $list->dataQuery()->query(); // There's no need to do all that joining - $query->setFrom(array(str_replace(array('"', '`'), '', $baseClasses[$class]) => $baseClasses[$class])); + $query->setFrom($table); $query->setSelect($select[$class]); $query->setOrderBy(array()); diff --git a/ORM/Versioning/ChangeSet.php b/ORM/Versioning/ChangeSet.php index ded5ccbcc..90e7b76b5 100644 --- a/ORM/Versioning/ChangeSet.php +++ b/ORM/Versioning/ChangeSet.php @@ -76,7 +76,7 @@ class ChangeSet extends DataObject { * @var array */ private static $important_classes = array( - 'SiteTree', + 'SilverStripe\\CMS\\Model\\SiteTree', 'File', ); diff --git a/Security/Member.php b/Security/Member.php index f838bf49c..8dcda39d1 100644 --- a/Security/Member.php +++ b/Security/Member.php @@ -2,6 +2,7 @@ namespace SilverStripe\Security; +use SilverStripe\CMS\Controllers\CMSMain; use SilverStripe\ORM\SS_Map; use SilverStripe\ORM\ValidationResult; use SilverStripe\ORM\FieldType\DBDatetime; @@ -1347,8 +1348,8 @@ class Member extends DataObject implements TemplateGlobalProvider { if(!$groups || $groups->Count() == 0) { $perms = array('ADMIN', 'CMS_ACCESS_AssetAdmin'); - if(class_exists('CMSMain')) { - $cmsPerms = singleton('CMSMain')->providePermissions(); + if(class_exists('SilverStripe\\CMS\\Controllers\\CMSMain')) { + $cmsPerms = CMSMain::singleton()->providePermissions(); } else { $cmsPerms = singleton('LeftAndMain')->providePermissions(); } diff --git a/Security/Security.php b/Security/Security.php index 320937971..7f002933a 100644 --- a/Security/Security.php +++ b/Security/Security.php @@ -485,7 +485,9 @@ class Security extends Controller implements TemplateGlobalProvider { * @return Controller */ protected function getResponseController($title) { - if(!class_exists('SiteTree')) return $this; + if (!class_exists('SilverStripe\\CMS\\Model\\SiteTree')) { + return $this; + } // Use sitetree pages to render the security page $tmpPage = new Page(); diff --git a/admin/client/dist/js/bundle-framework.js b/admin/client/dist/js/bundle-framework.js index 2049ac8d8..5bec7bde5 100644 --- a/admin/client/dist/js/bundle-framework.js +++ b/admin/client/dist/js/bundle-framework.js @@ -1,7 +1,7 @@ !function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o1){var last=this.props.breadcrumbs[this.props.breadcrumbs.length-2];if(last&&last.href)return event.preventDefault(),void this.props.router.push(last.href)}},CampaignAdmin.prototype.render=function(){var view=null;switch(this.props.params.view){case"show":view=this.renderItemListView();break;case"edit":view=this.renderDetailEditView();break;case"create":view=this.renderCreateView();break;default:view=this.renderIndexView()}return view},CampaignAdmin.prototype.renderIndexView=function(){var schemaUrl=this.props.sectionConfig.form.EditForm.schemaUrl,formActionProps={title:_i18n2["default"]._t("Campaigns.ADDCAMPAIGN"),icon:"plus",handleClick:this.addCampaign.bind(this)},formBuilderProps={createFn:this.campaignListCreateFn.bind(this),schemaUrl:schemaUrl};return _react2["default"].createElement("div",{className:"cms-content__inner no-preview"},_react2["default"].createElement("div",{className:"cms-content__left cms-campaigns collapse in","aria-expanded":"true"},_react2["default"].createElement(_Toolbar2["default"],null,_react2["default"].createElement(_Breadcrumb2["default"],{multiline:!0,crumbs:this.props.breadcrumbs})),_react2["default"].createElement("div",{className:"panel-scrollable panel-scrollable--single-toolbar"},_react2["default"].createElement("div",{className:"toolbar--content"},_react2["default"].createElement("div",{className:"btn-toolbar"},_react2["default"].createElement(_FormAction2["default"],formActionProps))),_react2["default"].createElement("div",{className:"campaign-admin container-fluid"},_react2["default"].createElement(_FormBuilder2["default"],formBuilderProps)))))},CampaignAdmin.prototype.renderItemListView=function(){var props={sectionConfig:this.props.sectionConfig,campaignId:this.props.params.id,itemListViewEndpoint:this.props.sectionConfig.itemListViewEndpoint,publishApi:this.publishApi,handleBackButtonClick:this.handleBackButtonClick.bind(this)};return _react2["default"].createElement(_CampaignAdminList2["default"],props)},CampaignAdmin.prototype.renderDetailEditView=function(){var baseSchemaUrl=this.props.sectionConfig.form.DetailEditForm.schemaUrl,formBuilderProps={createFn:this.campaignEditCreateFn.bind(this),schemaUrl:baseSchemaUrl+"/"+this.props.params.id};return _react2["default"].createElement("div",{className:"cms-content__inner"},_react2["default"].createElement(_Toolbar2["default"],{showBackButton:!0,handleBackButtonClick:this.handleBackButtonClick},_react2["default"].createElement(_Breadcrumb2["default"],{multiline:!0,crumbs:this.props.breadcrumbs})),_react2["default"].createElement("div",{className:"panel-scrollable panel-scrollable--single-toolbar container-fluid m-t-1"},_react2["default"].createElement("div",{className:"form--inline"},_react2["default"].createElement(_FormBuilder2["default"],formBuilderProps))))},CampaignAdmin.prototype.renderCreateView=function(){var baseSchemaUrl=this.props.sectionConfig.form.DetailEditForm.schemaUrl,formBuilderProps={createFn:this.campaignAddCreateFn.bind(this),schemaUrl:baseSchemaUrl+"/"+this.props.params.id};return _react2["default"].createElement("div",{className:"cms-content__inner"},_react2["default"].createElement(_Toolbar2["default"],{showBackButton:!0,handleBackButtonClick:this.handleBackButtonClick},_react2["default"].createElement(_Breadcrumb2["default"],{multiline:!0,crumbs:this.props.breadcrumbs})),_react2["default"].createElement("div",{className:"panel-scrollable panel-scrollable--single-toolbar container-fluid m-t-1"},_react2["default"].createElement(_FormBuilder2["default"],formBuilderProps)))},CampaignAdmin.prototype.campaignEditCreateFn=function(Component,props){var _this2=this,url=this.props.sectionConfig.url;if("action_cancel"===props.name){var extendedProps=_extends({},props,{handleClick:function(event){event.preventDefault(),_this2.props.router.push(url)}});return _react2["default"].createElement(Component,_extends({key:props.id},extendedProps))}return _react2["default"].createElement(Component,_extends({key:props.id},props))},CampaignAdmin.prototype.campaignAddCreateFn=function(Component,props){var _this3=this,url=this.props.sectionConfig.url;if("action_cancel"===props.name){var extendedProps=_extends({},props,{handleClick:function(event){event.preventDefault(),_this3.props.router.push(url)}});return _react2["default"].createElement(Component,_extends({key:props.name},extendedProps))}return _react2["default"].createElement(Component,_extends({key:props.name},props))},CampaignAdmin.prototype.campaignListCreateFn=function(Component,props){var _this4=this,sectionUrl=this.props.sectionConfig.url,typeUrlParam="set";if("GridField"===props.component){var extendedProps=_extends({},props,{data:_extends({},props.data,{handleDrillDown:function(event,record){_this4.props.router.push(sectionUrl+"/"+typeUrlParam+"/"+record.ID+"/show")},handleEditRecord:function(event,id){_this4.props.router.push(sectionUrl+"/"+typeUrlParam+"/"+id+"/edit")}})});return _react2["default"].createElement(Component,_extends({key:extendedProps.name},extendedProps))}return _react2["default"].createElement(Component,_extends({key:props.name},props))},CampaignAdmin.prototype.addCampaign=function(){var path=this.getActionRoute(0,"create");this.props.router.push(path)},CampaignAdmin.prototype.getActionRoute=function(id,view){return this.props.sectionConfig.url+"/set/"+id+"/"+view},CampaignAdmin}(_SilverStripeComponent2["default"]);CampaignAdmin.propTypes={breadcrumbsActions:_react2["default"].PropTypes.object.isRequired,campaignId:_react2["default"].PropTypes.string,sectionConfig:_react2["default"].PropTypes.object.isRequired,securityId:_react2["default"].PropTypes.string.isRequired,view:_react2["default"].PropTypes.string},exports["default"]=(0,_reactRouter.withRouter)((0,_reactRedux.connect)(mapStateToProps,mapDispatchToProps)(CampaignAdmin))},{"./CampaignAdminList":13,"components/Breadcrumb/Breadcrumb":"components/Breadcrumb/Breadcrumb","components/FormAction/FormAction":"components/FormAction/FormAction","components/FormBuilder/FormBuilder":"components/FormBuilder/FormBuilder","components/Toolbar/Toolbar":"components/Toolbar/Toolbar",i18n:"i18n","lib/Backend":"lib/Backend","lib/SilverStripeComponent":"lib/SilverStripeComponent",react:"react","react-redux":"react-redux","react-router":"react-router",redux:"redux","state/breadcrumbs/BreadcrumbsActions":"state/breadcrumbs/BreadcrumbsActions"}],12:[function(require,module,exports){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function _defaults(obj,defaults){for(var keys=Object.getOwnPropertyNames(defaults),i=0;i=200&&response.status<300))throw error=new Error(response.statusText),error.response=response,error;return ret=response}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(target){for(var i=1;i1)for(var i=1;i1&&(result=parts[0]+"@",string=parts[1]),string=string.replace(regexSeparators,".");var labels=string.split("."),encoded=map(labels,fn).join(".");return result+encoded}function ucs2decode(string){for(var value,extra,output=[],counter=0,length=string.length;length>counter;)value=string.charCodeAt(counter++),value>=55296&&56319>=value&&length>counter?(extra=string.charCodeAt(counter++),56320==(64512&extra)?output.push(((1023&value)<<10)+(1023&extra)+65536):(output.push(value),counter--)):output.push(value);return output}function ucs2encode(array){return map(array,function(value){var output="";return value>65535&&(value-=65536,output+=stringFromCharCode(value>>>10&1023|55296),value=56320|1023&value),output+=stringFromCharCode(value)}).join("")}function basicToDigit(codePoint){return 10>codePoint-48?codePoint-22:26>codePoint-65?codePoint-65:26>codePoint-97?codePoint-97:base}function digitToBasic(digit,flag){return digit+22+75*(26>digit)-((0!=flag)<<5)}function adapt(delta,numPoints,firstTime){var k=0;for(delta=firstTime?floor(delta/damp):delta>>1,delta+=floor(delta/numPoints);delta>baseMinusTMin*tMax>>1;k+=base)delta=floor(delta/baseMinusTMin);return floor(k+(baseMinusTMin+1)*delta/(delta+skew))}function decode(input){var out,basic,j,index,oldi,w,k,digit,t,baseMinusT,output=[],inputLength=input.length,i=0,n=initialN,bias=initialBias;for(basic=input.lastIndexOf(delimiter),0>basic&&(basic=0),j=0;basic>j;++j)input.charCodeAt(j)>=128&&error("not-basic"),output.push(input.charCodeAt(j));for(index=basic>0?basic+1:0;inputLength>index;){for(oldi=i,w=1,k=base;index>=inputLength&&error("invalid-input"),digit=basicToDigit(input.charCodeAt(index++)),(digit>=base||digit>floor((maxInt-i)/w))&&error("overflow"),i+=digit*w,t=bias>=k?tMin:k>=bias+tMax?tMax:k-bias,!(t>digit);k+=base)baseMinusT=base-t,w>floor(maxInt/baseMinusT)&&error("overflow"),w*=baseMinusT;out=output.length+1,bias=adapt(i-oldi,out,0==oldi),floor(i/out)>maxInt-n&&error("overflow"),n+=floor(i/out),i%=out,output.splice(i++,0,n)}return ucs2encode(output)}function encode(input){var n,delta,handledCPCount,basicLength,bias,j,m,q,k,t,currentValue,inputLength,handledCPCountPlusOne,baseMinusT,qMinusT,output=[];for(input=ucs2decode(input),inputLength=input.length,n=initialN,delta=0,bias=initialBias,j=0;inputLength>j;++j)currentValue=input[j],128>currentValue&&output.push(stringFromCharCode(currentValue));for(handledCPCount=basicLength=output.length,basicLength&&output.push(delimiter);inputLength>handledCPCount;){for(m=maxInt,j=0;inputLength>j;++j)currentValue=input[j],currentValue>=n&&m>currentValue&&(m=currentValue);for(handledCPCountPlusOne=handledCPCount+1,m-n>floor((maxInt-delta)/handledCPCountPlusOne)&&error("overflow"),delta+=(m-n)*handledCPCountPlusOne,n=m,j=0;inputLength>j;++j)if(currentValue=input[j],n>currentValue&&++delta>maxInt&&error("overflow"),currentValue==n){for(q=delta,k=base;t=bias>=k?tMin:k>=bias+tMax?tMax:k-bias,!(t>q);k+=base)qMinusT=q-t,baseMinusT=base-t,output.push(stringFromCharCode(digitToBasic(t+qMinusT%baseMinusT,0))),q=floor(qMinusT/baseMinusT);output.push(stringFromCharCode(digitToBasic(q,0))),bias=adapt(delta,handledCPCountPlusOne,handledCPCount==basicLength),delta=0,++handledCPCount}++delta,++n}return output.join("")}function toUnicode(input){return mapDomain(input,function(string){return regexPunycode.test(string)?decode(string.slice(4).toLowerCase()):string})}function toASCII(input){return mapDomain(input,function(string){return regexNonASCII.test(string)?"xn--"+encode(string):string})}var freeExports="object"==typeof exports&&exports&&!exports.nodeType&&exports,freeModule="object"==typeof module&&module&&!module.nodeType&&module,freeGlobal="object"==typeof global&&global;freeGlobal.global!==freeGlobal&&freeGlobal.window!==freeGlobal&&freeGlobal.self!==freeGlobal||(root=freeGlobal);var punycode,key,maxInt=2147483647,base=36,tMin=1,tMax=26,skew=38,damp=700,initialBias=72,initialN=128,delimiter="-",regexPunycode=/^xn--/,regexNonASCII=/[^\x20-\x7E]/,regexSeparators=/[\x2E\u3002\uFF0E\uFF61]/g,errors={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},baseMinusTMin=base-tMin,floor=Math.floor,stringFromCharCode=String.fromCharCode;if(punycode={version:"1.3.2",ucs2:{decode:ucs2decode,encode:ucs2encode},decode:decode,encode:encode,toASCII:toASCII,toUnicode:toUnicode},"function"==typeof define&&"object"==typeof define.amd&&define.amd)define("punycode",function(){return punycode});else if(freeExports&&freeModule)if(module.exports==freeExports)freeModule.exports=punycode;else for(key in punycode)punycode.hasOwnProperty(key)&&(freeExports[key]=punycode[key]);else root.punycode=punycode}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],36:[function(require,module,exports){"use strict";function hasOwnProperty(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}module.exports=function(qs,sep,eq,options){sep=sep||"&",eq=eq||"=";var obj={};if("string"!=typeof qs||0===qs.length)return obj;var regexp=/\+/g;qs=qs.split(sep);var maxKeys=1e3;options&&"number"==typeof options.maxKeys&&(maxKeys=options.maxKeys);var len=qs.length;maxKeys>0&&len>maxKeys&&(len=maxKeys);for(var i=0;len>i;++i){var kstr,vstr,k,v,x=qs[i].replace(regexp,"%20"),idx=x.indexOf(eq);idx>=0?(kstr=x.substr(0,idx),vstr=x.substr(idx+1)):(kstr=x,vstr=""),k=decodeURIComponent(kstr),v=decodeURIComponent(vstr),hasOwnProperty(obj,k)?isArray(obj[k])?obj[k].push(v):obj[k]=[obj[k],v]:obj[k]=v}return obj};var isArray=Array.isArray||function(xs){return"[object Array]"===Object.prototype.toString.call(xs)}},{}],37:[function(require,module,exports){"use strict";function map(xs,f){if(xs.map)return xs.map(f);for(var res=[],i=0;i0&&"number"!=typeof x[0]):!1}function objEquiv(a,b,opts){var i,key;if(isUndefinedOrNull(a)||isUndefinedOrNull(b))return!1;if(a.prototype!==b.prototype)return!1;if(isArguments(a))return isArguments(b)?(a=pSlice.call(a),b=pSlice.call(b),deepEqual(a,b,opts)):!1;if(isBuffer(a)){if(!isBuffer(b))return!1;if(a.length!==b.length)return!1;for(i=0;i=0;i--)if(ka[i]!=kb[i])return!1;for(i=ka.length-1;i>=0;i--)if(key=ka[i],!deepEqual(a[key],b[key],opts))return!1;return typeof a==typeof b}var pSlice=Array.prototype.slice,objectKeys=require("./lib/keys.js"),isArguments=require("./lib/is_arguments.js"),deepEqual=module.exports=function(actual,expected,opts){return opts||(opts={}),actual===expected?!0:actual instanceof Date&&expected instanceof Date?actual.getTime()===expected.getTime():!actual||!expected||"object"!=typeof actual&&"object"!=typeof expected?opts.strict?actual===expected:actual==expected:objEquiv(actual,expected,opts)}},{"./lib/is_arguments.js":40,"./lib/keys.js":41}],40:[function(require,module,exports){function supported(object){return"[object Arguments]"==Object.prototype.toString.call(object)}function unsupported(object){return object&&"object"==typeof object&&"number"==typeof object.length&&Object.prototype.hasOwnProperty.call(object,"callee")&&!Object.prototype.propertyIsEnumerable.call(object,"callee")||!1}var supportsArgumentsClass="[object Arguments]"==function(){return Object.prototype.toString.call(arguments)}();exports=module.exports=supportsArgumentsClass?supported:unsupported,exports.supported=supported,exports.unsupported=unsupported},{}],41:[function(require,module,exports){function shim(obj){var keys=[];for(var key in obj)keys.push(key);return keys}exports=module.exports="function"==typeof Object.keys?Object.keys:shim,exports.shim=shim},{}],42:[function(require,module,exports){(function(process,global){(function(){"use strict";function lib$es6$promise$utils$$objectOrFunction(x){return"function"==typeof x||"object"==typeof x&&null!==x}function lib$es6$promise$utils$$isFunction(x){return"function"==typeof x}function lib$es6$promise$asap$$setScheduler(scheduleFn){lib$es6$promise$asap$$customSchedulerFn=scheduleFn}function lib$es6$promise$asap$$setAsap(asapFn){lib$es6$promise$asap$$asap=asapFn}function lib$es6$promise$asap$$useNextTick(){return function(){process.nextTick(lib$es6$promise$asap$$flush)}}function lib$es6$promise$asap$$useVertxTimer(){return function(){lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush)}}function lib$es6$promise$asap$$useMutationObserver(){var iterations=0,observer=new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush),node=document.createTextNode("");return observer.observe(node,{characterData:!0}),function(){node.data=iterations=++iterations%2}}function lib$es6$promise$asap$$useMessageChannel(){var channel=new MessageChannel;return channel.port1.onmessage=lib$es6$promise$asap$$flush,function(){channel.port2.postMessage(0)}}function lib$es6$promise$asap$$useSetTimeout(){return function(){setTimeout(lib$es6$promise$asap$$flush,1)}}function lib$es6$promise$asap$$flush(){for(var i=0;lib$es6$promise$asap$$len>i;i+=2){var callback=lib$es6$promise$asap$$queue[i],arg=lib$es6$promise$asap$$queue[i+1];callback(arg),lib$es6$promise$asap$$queue[i]=void 0, -lib$es6$promise$asap$$queue[i+1]=void 0}lib$es6$promise$asap$$len=0}function lib$es6$promise$asap$$attemptVertx(){try{var r=require,vertx=r("vertx");return lib$es6$promise$asap$$vertxNext=vertx.runOnLoop||vertx.runOnContext,lib$es6$promise$asap$$useVertxTimer()}catch(e){return lib$es6$promise$asap$$useSetTimeout()}}function lib$es6$promise$then$$then(onFulfillment,onRejection){var parent=this,state=parent._state;if(state===lib$es6$promise$$internal$$FULFILLED&&!onFulfillment||state===lib$es6$promise$$internal$$REJECTED&&!onRejection)return this;var child=new this.constructor(lib$es6$promise$$internal$$noop),result=parent._result;if(state){var callback=arguments[state-1];lib$es6$promise$asap$$asap(function(){lib$es6$promise$$internal$$invokeCallback(state,child,callback,result)})}else lib$es6$promise$$internal$$subscribe(parent,child,onFulfillment,onRejection);return child}function lib$es6$promise$promise$resolve$$resolve(object){var Constructor=this;if(object&&"object"==typeof object&&object.constructor===Constructor)return object;var promise=new Constructor(lib$es6$promise$$internal$$noop);return lib$es6$promise$$internal$$resolve(promise,object),promise}function lib$es6$promise$$internal$$noop(){}function lib$es6$promise$$internal$$selfFulfillment(){return new TypeError("You cannot resolve a promise with itself")}function lib$es6$promise$$internal$$cannotReturnOwn(){return new TypeError("A promises callback cannot return that same promise.")}function lib$es6$promise$$internal$$getThen(promise){try{return promise.then}catch(error){return lib$es6$promise$$internal$$GET_THEN_ERROR.error=error,lib$es6$promise$$internal$$GET_THEN_ERROR}}function lib$es6$promise$$internal$$tryThen(then,value,fulfillmentHandler,rejectionHandler){try{then.call(value,fulfillmentHandler,rejectionHandler)}catch(e){return e}}function lib$es6$promise$$internal$$handleForeignThenable(promise,thenable,then){lib$es6$promise$asap$$asap(function(promise){var sealed=!1,error=lib$es6$promise$$internal$$tryThen(then,thenable,function(value){sealed||(sealed=!0,thenable!==value?lib$es6$promise$$internal$$resolve(promise,value):lib$es6$promise$$internal$$fulfill(promise,value))},function(reason){sealed||(sealed=!0,lib$es6$promise$$internal$$reject(promise,reason))},"Settle: "+(promise._label||" unknown promise"));!sealed&&error&&(sealed=!0,lib$es6$promise$$internal$$reject(promise,error))},promise)}function lib$es6$promise$$internal$$handleOwnThenable(promise,thenable){thenable._state===lib$es6$promise$$internal$$FULFILLED?lib$es6$promise$$internal$$fulfill(promise,thenable._result):thenable._state===lib$es6$promise$$internal$$REJECTED?lib$es6$promise$$internal$$reject(promise,thenable._result):lib$es6$promise$$internal$$subscribe(thenable,void 0,function(value){lib$es6$promise$$internal$$resolve(promise,value)},function(reason){lib$es6$promise$$internal$$reject(promise,reason)})}function lib$es6$promise$$internal$$handleMaybeThenable(promise,maybeThenable,then){maybeThenable.constructor===promise.constructor&&then===lib$es6$promise$then$$default&&constructor.resolve===lib$es6$promise$promise$resolve$$default?lib$es6$promise$$internal$$handleOwnThenable(promise,maybeThenable):then===lib$es6$promise$$internal$$GET_THEN_ERROR?lib$es6$promise$$internal$$reject(promise,lib$es6$promise$$internal$$GET_THEN_ERROR.error):void 0===then?lib$es6$promise$$internal$$fulfill(promise,maybeThenable):lib$es6$promise$utils$$isFunction(then)?lib$es6$promise$$internal$$handleForeignThenable(promise,maybeThenable,then):lib$es6$promise$$internal$$fulfill(promise,maybeThenable)}function lib$es6$promise$$internal$$resolve(promise,value){promise===value?lib$es6$promise$$internal$$reject(promise,lib$es6$promise$$internal$$selfFulfillment()):lib$es6$promise$utils$$objectOrFunction(value)?lib$es6$promise$$internal$$handleMaybeThenable(promise,value,lib$es6$promise$$internal$$getThen(value)):lib$es6$promise$$internal$$fulfill(promise,value)}function lib$es6$promise$$internal$$publishRejection(promise){promise._onerror&&promise._onerror(promise._result),lib$es6$promise$$internal$$publish(promise)}function lib$es6$promise$$internal$$fulfill(promise,value){promise._state===lib$es6$promise$$internal$$PENDING&&(promise._result=value,promise._state=lib$es6$promise$$internal$$FULFILLED,0!==promise._subscribers.length&&lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish,promise))}function lib$es6$promise$$internal$$reject(promise,reason){promise._state===lib$es6$promise$$internal$$PENDING&&(promise._state=lib$es6$promise$$internal$$REJECTED,promise._result=reason,lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publishRejection,promise))}function lib$es6$promise$$internal$$subscribe(parent,child,onFulfillment,onRejection){var subscribers=parent._subscribers,length=subscribers.length;parent._onerror=null,subscribers[length]=child,subscribers[length+lib$es6$promise$$internal$$FULFILLED]=onFulfillment,subscribers[length+lib$es6$promise$$internal$$REJECTED]=onRejection,0===length&&parent._state&&lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish,parent)}function lib$es6$promise$$internal$$publish(promise){var subscribers=promise._subscribers,settled=promise._state;if(0!==subscribers.length){for(var child,callback,detail=promise._result,i=0;ii;i++)lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]),void 0,onFulfillment,onRejection);return promise}function lib$es6$promise$promise$reject$$reject(reason){var Constructor=this,promise=new Constructor(lib$es6$promise$$internal$$noop);return lib$es6$promise$$internal$$reject(promise,reason),promise}function lib$es6$promise$promise$$needsResolver(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function lib$es6$promise$promise$$needsNew(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function lib$es6$promise$promise$$Promise(resolver){this._id=lib$es6$promise$promise$$counter++,this._state=void 0,this._result=void 0,this._subscribers=[],lib$es6$promise$$internal$$noop!==resolver&&("function"!=typeof resolver&&lib$es6$promise$promise$$needsResolver(),this instanceof lib$es6$promise$promise$$Promise?lib$es6$promise$$internal$$initializePromise(this,resolver):lib$es6$promise$promise$$needsNew())}function lib$es6$promise$enumerator$$Enumerator(Constructor,input){this._instanceConstructor=Constructor,this.promise=new Constructor(lib$es6$promise$$internal$$noop),Array.isArray(input)?(this._input=input,this.length=input.length,this._remaining=input.length,this._result=new Array(this.length),0===this.length?lib$es6$promise$$internal$$fulfill(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&lib$es6$promise$$internal$$fulfill(this.promise,this._result))):lib$es6$promise$$internal$$reject(this.promise,this._validationError())}function lib$es6$promise$polyfill$$polyfill(){var local;if("undefined"!=typeof global)local=global;else if("undefined"!=typeof self)local=self;else try{local=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var P=local.Promise;P&&"[object Promise]"===Object.prototype.toString.call(P.resolve())&&!P.cast||(local.Promise=lib$es6$promise$promise$$default)}var lib$es6$promise$utils$$_isArray;lib$es6$promise$utils$$_isArray=Array.isArray?Array.isArray:function(x){return"[object Array]"===Object.prototype.toString.call(x)};var lib$es6$promise$asap$$vertxNext,lib$es6$promise$asap$$customSchedulerFn,lib$es6$promise$asap$$scheduleFlush,lib$es6$promise$utils$$isArray=lib$es6$promise$utils$$_isArray,lib$es6$promise$asap$$len=0,lib$es6$promise$asap$$asap=function(callback,arg){lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len]=callback,lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len+1]=arg,lib$es6$promise$asap$$len+=2,2===lib$es6$promise$asap$$len&&(lib$es6$promise$asap$$customSchedulerFn?lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush):lib$es6$promise$asap$$scheduleFlush())},lib$es6$promise$asap$$browserWindow="undefined"!=typeof window?window:void 0,lib$es6$promise$asap$$browserGlobal=lib$es6$promise$asap$$browserWindow||{},lib$es6$promise$asap$$BrowserMutationObserver=lib$es6$promise$asap$$browserGlobal.MutationObserver||lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver,lib$es6$promise$asap$$isNode="undefined"!=typeof process&&"[object process]"==={}.toString.call(process),lib$es6$promise$asap$$isWorker="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,lib$es6$promise$asap$$queue=new Array(1e3);lib$es6$promise$asap$$scheduleFlush=lib$es6$promise$asap$$isNode?lib$es6$promise$asap$$useNextTick():lib$es6$promise$asap$$BrowserMutationObserver?lib$es6$promise$asap$$useMutationObserver():lib$es6$promise$asap$$isWorker?lib$es6$promise$asap$$useMessageChannel():void 0===lib$es6$promise$asap$$browserWindow&&"function"==typeof require?lib$es6$promise$asap$$attemptVertx():lib$es6$promise$asap$$useSetTimeout();var lib$es6$promise$then$$default=lib$es6$promise$then$$then,lib$es6$promise$promise$resolve$$default=lib$es6$promise$promise$resolve$$resolve,lib$es6$promise$$internal$$PENDING=void 0,lib$es6$promise$$internal$$FULFILLED=1,lib$es6$promise$$internal$$REJECTED=2,lib$es6$promise$$internal$$GET_THEN_ERROR=new lib$es6$promise$$internal$$ErrorObject,lib$es6$promise$$internal$$TRY_CATCH_ERROR=new lib$es6$promise$$internal$$ErrorObject,lib$es6$promise$promise$all$$default=lib$es6$promise$promise$all$$all,lib$es6$promise$promise$race$$default=lib$es6$promise$promise$race$$race,lib$es6$promise$promise$reject$$default=lib$es6$promise$promise$reject$$reject,lib$es6$promise$promise$$counter=0,lib$es6$promise$promise$$default=lib$es6$promise$promise$$Promise;lib$es6$promise$promise$$Promise.all=lib$es6$promise$promise$all$$default,lib$es6$promise$promise$$Promise.race=lib$es6$promise$promise$race$$default,lib$es6$promise$promise$$Promise.resolve=lib$es6$promise$promise$resolve$$default,lib$es6$promise$promise$$Promise.reject=lib$es6$promise$promise$reject$$default,lib$es6$promise$promise$$Promise._setScheduler=lib$es6$promise$asap$$setScheduler,lib$es6$promise$promise$$Promise._setAsap=lib$es6$promise$asap$$setAsap,lib$es6$promise$promise$$Promise._asap=lib$es6$promise$asap$$asap,lib$es6$promise$promise$$Promise.prototype={constructor:lib$es6$promise$promise$$Promise,then:lib$es6$promise$then$$default,"catch":function(onRejection){return this.then(null,onRejection)}};var lib$es6$promise$enumerator$$default=lib$es6$promise$enumerator$$Enumerator;lib$es6$promise$enumerator$$Enumerator.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},lib$es6$promise$enumerator$$Enumerator.prototype._enumerate=function(){for(var length=this.length,input=this._input,i=0;this._state===lib$es6$promise$$internal$$PENDING&&length>i;i++)this._eachEntry(input[i],i)},lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry=function(entry,i){var c=this._instanceConstructor,resolve=c.resolve;if(resolve===lib$es6$promise$promise$resolve$$default){var then=lib$es6$promise$$internal$$getThen(entry);if(then===lib$es6$promise$then$$default&&entry._state!==lib$es6$promise$$internal$$PENDING)this._settledAt(entry._state,i,entry._result);else if("function"!=typeof then)this._remaining--,this._result[i]=entry;else if(c===lib$es6$promise$promise$$default){var promise=new c(lib$es6$promise$$internal$$noop);lib$es6$promise$$internal$$handleMaybeThenable(promise,entry,then),this._willSettleAt(promise,i)}else this._willSettleAt(new c(function(resolve){resolve(entry)}),i)}else this._willSettleAt(resolve(entry),i)},lib$es6$promise$enumerator$$Enumerator.prototype._settledAt=function(state,i,value){var promise=this.promise;promise._state===lib$es6$promise$$internal$$PENDING&&(this._remaining--,state===lib$es6$promise$$internal$$REJECTED?lib$es6$promise$$internal$$reject(promise,value):this._result[i]=value),0===this._remaining&&lib$es6$promise$$internal$$fulfill(promise,this._result)},lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt=function(promise,i){var enumerator=this;lib$es6$promise$$internal$$subscribe(promise,void 0,function(value){enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED,i,value)},function(reason){enumerator._settledAt(lib$es6$promise$$internal$$REJECTED,i,reason)})};var lib$es6$promise$polyfill$$default=lib$es6$promise$polyfill$$polyfill,lib$es6$promise$umd$$ES6Promise={Promise:lib$es6$promise$promise$$default,polyfill:lib$es6$promise$polyfill$$default};"function"==typeof define&&define.amd?define(function(){return lib$es6$promise$umd$$ES6Promise}):"undefined"!=typeof module&&module.exports?module.exports=lib$es6$promise$umd$$ES6Promise:"undefined"!=typeof this&&(this.ES6Promise=lib$es6$promise$umd$$ES6Promise),lib$es6$promise$polyfill$$default()}).call(this)}).call(this,require("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:34}],43:[function(require,module,exports){"use strict";exports.__esModule=!0;var PUSH="PUSH";exports.PUSH=PUSH;var REPLACE="REPLACE";exports.REPLACE=REPLACE;var POP="POP";exports.POP=POP,exports["default"]={PUSH:PUSH,REPLACE:REPLACE,POP:POP}},{}],44:[function(require,module,exports){"use strict";function loopAsync(turns,work,callback){function done(){return isDone=!0,sync?void(doneArgs=[].concat(_slice.call(arguments))):void callback.apply(this,arguments)}function next(){if(!isDone&&(hasNext=!0,!sync)){for(sync=!0;!isDone&&turns>currentTurn&&hasNext;)hasNext=!1,work.call(this,currentTurn++,next,done);return sync=!1,isDone?void callback.apply(this,doneArgs):void(currentTurn>=turns&&hasNext&&(isDone=!0,callback()))}}var currentTurn=0,isDone=!1,sync=!1,hasNext=!1,doneArgs=void 0;next()}exports.__esModule=!0;var _slice=Array.prototype.slice;exports.loopAsync=loopAsync},{}],45:[function(require,module,exports){(function(process){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function createKey(key){return KeyPrefix+key}function saveState(key,state){try{null==state?window.sessionStorage.removeItem(createKey(key)):window.sessionStorage.setItem(createKey(key),JSON.stringify(state))}catch(error){if(error.name===SecurityError)return void("production"!==process.env.NODE_ENV?_warning2["default"](!1,"[history] Unable to save state; sessionStorage is not available due to security settings"):void 0);if(QuotaExceededErrors.indexOf(error.name)>=0&&0===window.sessionStorage.length)return void("production"!==process.env.NODE_ENV?_warning2["default"](!1,"[history] Unable to save state; sessionStorage is not available in Safari private mode"):void 0);throw error}}function readState(key){var json=void 0;try{json=window.sessionStorage.getItem(createKey(key))}catch(error){if(error.name===SecurityError)return"production"!==process.env.NODE_ENV?_warning2["default"](!1,"[history] Unable to read state; sessionStorage is not available due to security settings"):void 0,null}if(json)try{return JSON.parse(json)}catch(error){}return null}exports.__esModule=!0,exports.saveState=saveState,exports.readState=readState;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning),KeyPrefix="@@History/",QuotaExceededErrors=["QuotaExceededError","QUOTA_EXCEEDED_ERR"],SecurityError="SecurityError"}).call(this,require("_process"))},{_process:34,warning:56}],46:[function(require,module,exports){"use strict";function addEventListener(node,event,listener){node.addEventListener?node.addEventListener(event,listener,!1):node.attachEvent("on"+event,listener)}function removeEventListener(node,event,listener){node.removeEventListener?node.removeEventListener(event,listener,!1):node.detachEvent("on"+event,listener)}function getHashPath(){return window.location.href.split("#")[1]||""}function replaceHashPath(path){window.location.replace(window.location.pathname+window.location.search+"#"+path)}function getWindowPath(){return window.location.pathname+window.location.search+window.location.hash}function go(n){n&&window.history.go(n)}function getUserConfirmation(message,callback){callback(window.confirm(message))}function supportsHistory(){var ua=navigator.userAgent;return-1===ua.indexOf("Android 2.")&&-1===ua.indexOf("Android 4.0")||-1===ua.indexOf("Mobile Safari")||-1!==ua.indexOf("Chrome")||-1!==ua.indexOf("Windows Phone")?window.history&&"pushState"in window.history:!1}function supportsGoWithoutReloadUsingHash(){var ua=navigator.userAgent;return-1===ua.indexOf("Firefox")}exports.__esModule=!0,exports.addEventListener=addEventListener,exports.removeEventListener=removeEventListener,exports.getHashPath=getHashPath,exports.replaceHashPath=replaceHashPath,exports.getWindowPath=getWindowPath,exports.go=go,exports.getUserConfirmation=getUserConfirmation,exports.supportsHistory=supportsHistory,exports.supportsGoWithoutReloadUsingHash=supportsGoWithoutReloadUsingHash},{}],47:[function(require,module,exports){"use strict";exports.__esModule=!0;var canUseDOM=!("undefined"==typeof window||!window.document||!window.document.createElement);exports.canUseDOM=canUseDOM},{}],48:[function(require,module,exports){(function(process){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function extractPath(string){var match=string.match(/^https?:\/\/[^\/]*/);return null==match?string:string.substring(match[0].length)}function parsePath(path){var pathname=extractPath(path),search="",hash="";"production"!==process.env.NODE_ENV?_warning2["default"](path===pathname,'A path must be pathname + search + hash only, not a fully qualified URL like "%s"',path):void 0;var hashIndex=pathname.indexOf("#");-1!==hashIndex&&(hash=pathname.substring(hashIndex),pathname=pathname.substring(0,hashIndex));var searchIndex=pathname.indexOf("?");return-1!==searchIndex&&(search=pathname.substring(searchIndex),pathname=pathname.substring(0,searchIndex)),""===pathname&&(pathname="/"),{pathname:pathname,search:search,hash:hash}}exports.__esModule=!0,exports.extractPath=extractPath,exports.parsePath=parsePath;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning)}).call(this,require("_process"))},{_process:34,warning:56}],49:[function(require,module,exports){(function(process){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function createBrowserHistory(){function getCurrentLocation(historyState){try{historyState=historyState||window.history.state||{}}catch(e){historyState={}}var path=_DOMUtils.getWindowPath(),_historyState=historyState,key=_historyState.key,state=void 0;key?state=_DOMStateStorage.readState(key):(state=null,key=history.createKey(),isSupported&&window.history.replaceState(_extends({},historyState,{key:key}),null));var location=_PathUtils.parsePath(path);return history.createLocation(_extends({},location,{state:state}),void 0,key)}function startPopStateListener(_ref){function popStateListener(event){void 0!==event.state&&transitionTo(getCurrentLocation(event.state))}var transitionTo=_ref.transitionTo;return _DOMUtils.addEventListener(window,"popstate",popStateListener),function(){_DOMUtils.removeEventListener(window,"popstate",popStateListener)}}function finishTransition(location){var basename=location.basename,pathname=location.pathname,search=location.search,hash=location.hash,state=location.state,action=location.action,key=location.key;if(action!==_Actions.POP){_DOMStateStorage.saveState(key,state);var path=(basename||"")+pathname+search+hash,historyState={key:key};if(action===_Actions.PUSH){if(useRefresh)return window.location.href=path,!1;window.history.pushState(historyState,null,path)}else{if(useRefresh)return window.location.replace(path),!1;window.history.replaceState(historyState,null,path)}}}function listenBefore(listener){1===++listenerCount&&(stopPopStateListener=startPopStateListener(history));var unlisten=history.listenBefore(listener);return function(){unlisten(),0===--listenerCount&&stopPopStateListener()}}function listen(listener){1===++listenerCount&&(stopPopStateListener=startPopStateListener(history));var unlisten=history.listen(listener);return function(){unlisten(),0===--listenerCount&&stopPopStateListener()}}function registerTransitionHook(hook){1===++listenerCount&&(stopPopStateListener=startPopStateListener(history)),history.registerTransitionHook(hook)}function unregisterTransitionHook(hook){history.unregisterTransitionHook(hook),0===--listenerCount&&stopPopStateListener()}var options=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];_ExecutionEnvironment.canUseDOM?void 0:"production"!==process.env.NODE_ENV?_invariant2["default"](!1,"Browser history needs a DOM"):_invariant2["default"](!1);var forceRefresh=options.forceRefresh,isSupported=_DOMUtils.supportsHistory(),useRefresh=!isSupported||forceRefresh,history=_createDOMHistory2["default"](_extends({},options,{getCurrentLocation:getCurrentLocation,finishTransition:finishTransition,saveState:_DOMStateStorage.saveState})),listenerCount=0,stopPopStateListener=void 0;return _extends({},history,{listenBefore:listenBefore,listen:listen,registerTransitionHook:registerTransitionHook,unregisterTransitionHook:unregisterTransitionHook})}exports.__esModule=!0;var _extends=Object.assign||function(target){for(var i=1;i1){var last=this.props.breadcrumbs[this.props.breadcrumbs.length-2];if(last&&last.href)return event.preventDefault(),void this.props.router.push(last.href)}},CampaignAdmin.prototype.render=function(){var view=null;switch(this.props.params.view){case"show":view=this.renderItemListView();break;case"edit":view=this.renderDetailEditView();break;case"create":view=this.renderCreateView();break;default:view=this.renderIndexView()}return view},CampaignAdmin.prototype.renderIndexView=function(){var schemaUrl=this.props.sectionConfig.form.EditForm.schemaUrl,formActionProps={title:_i18n2["default"]._t("Campaigns.ADDCAMPAIGN"),icon:"plus",handleClick:this.addCampaign.bind(this)},formBuilderProps={createFn:this.campaignListCreateFn.bind(this),schemaUrl:schemaUrl};return _react2["default"].createElement("div",{className:"cms-content__inner no-preview"},_react2["default"].createElement("div",{className:"cms-content__left cms-campaigns collapse in","aria-expanded":"true"},_react2["default"].createElement(_Toolbar2["default"],null,_react2["default"].createElement(_Breadcrumb2["default"],{multiline:!0,crumbs:this.props.breadcrumbs})),_react2["default"].createElement("div",{className:"panel-scrollable panel-scrollable--single-toolbar"},_react2["default"].createElement("div",{className:"toolbar--content"},_react2["default"].createElement("div",{className:"btn-toolbar"},_react2["default"].createElement(_FormAction2["default"],formActionProps))),_react2["default"].createElement("div",{className:"campaign-admin container-fluid"},_react2["default"].createElement(_FormBuilder2["default"],formBuilderProps)))))},CampaignAdmin.prototype.renderItemListView=function(){var props={sectionConfig:this.props.sectionConfig,campaignId:this.props.params.id,itemListViewEndpoint:this.props.sectionConfig.itemListViewEndpoint,publishApi:this.publishApi,handleBackButtonClick:this.handleBackButtonClick.bind(this)};return _react2["default"].createElement(_CampaignAdminList2["default"],props)},CampaignAdmin.prototype.renderDetailEditView=function(){var baseSchemaUrl=this.props.sectionConfig.form.DetailEditForm.schemaUrl,formBuilderProps={createFn:this.campaignEditCreateFn.bind(this),schemaUrl:baseSchemaUrl+"/"+this.props.params.id};return _react2["default"].createElement("div",{className:"cms-content__inner"},_react2["default"].createElement(_Toolbar2["default"],{showBackButton:!0,handleBackButtonClick:this.handleBackButtonClick},_react2["default"].createElement(_Breadcrumb2["default"],{multiline:!0,crumbs:this.props.breadcrumbs})),_react2["default"].createElement("div",{className:"panel-scrollable panel-scrollable--single-toolbar container-fluid m-t-1"},_react2["default"].createElement("div",{className:"form--inline"},_react2["default"].createElement(_FormBuilder2["default"],formBuilderProps))))},CampaignAdmin.prototype.renderCreateView=function(){var baseSchemaUrl=this.props.sectionConfig.form.DetailEditForm.schemaUrl,formBuilderProps={createFn:this.campaignAddCreateFn.bind(this),schemaUrl:baseSchemaUrl+"/"+this.props.params.id};return _react2["default"].createElement("div",{className:"cms-content__inner"},_react2["default"].createElement(_Toolbar2["default"],{showBackButton:!0,handleBackButtonClick:this.handleBackButtonClick},_react2["default"].createElement(_Breadcrumb2["default"],{multiline:!0,crumbs:this.props.breadcrumbs})),_react2["default"].createElement("div",{className:"panel-scrollable panel-scrollable--single-toolbar container-fluid m-t-1"},_react2["default"].createElement(_FormBuilder2["default"],formBuilderProps)))},CampaignAdmin.prototype.campaignEditCreateFn=function(Component,props){var _this2=this,url=this.props.sectionConfig.url;if("action_cancel"===props.name){var extendedProps=_extends({},props,{handleClick:function(event){event.preventDefault(),_this2.props.router.push(url)}});return _react2["default"].createElement(Component,_extends({key:props.id},extendedProps))}return _react2["default"].createElement(Component,_extends({key:props.id},props))},CampaignAdmin.prototype.campaignAddCreateFn=function(Component,props){var _this3=this,url=this.props.sectionConfig.url;if("action_cancel"===props.name){var extendedProps=_extends({},props,{handleClick:function(event){event.preventDefault(),_this3.props.router.push(url)}});return _react2["default"].createElement(Component,_extends({key:props.name},extendedProps))}return _react2["default"].createElement(Component,_extends({key:props.name},props))},CampaignAdmin.prototype.campaignListCreateFn=function(Component,props){var _this4=this,sectionUrl=this.props.sectionConfig.url,typeUrlParam="set";if("GridField"===props.component){var extendedProps=_extends({},props,{data:_extends({},props.data,{handleDrillDown:function(event,record){_this4.props.router.push(sectionUrl+"/"+typeUrlParam+"/"+record.ID+"/show")},handleEditRecord:function(event,id){_this4.props.router.push(sectionUrl+"/"+typeUrlParam+"/"+id+"/edit")}})});return _react2["default"].createElement(Component,_extends({key:extendedProps.name},extendedProps))}return _react2["default"].createElement(Component,_extends({key:props.name},props))},CampaignAdmin.prototype.addCampaign=function(){var path=this.getActionRoute(0,"create");this.props.router.push(path)},CampaignAdmin.prototype.getActionRoute=function(id,view){return this.props.sectionConfig.url+"/set/"+id+"/"+view},CampaignAdmin}(_SilverStripeComponent2["default"]);CampaignAdmin.propTypes={breadcrumbsActions:_react2["default"].PropTypes.object.isRequired,campaignId:_react2["default"].PropTypes.string,sectionConfig:_react2["default"].PropTypes.object.isRequired,securityId:_react2["default"].PropTypes.string.isRequired,view:_react2["default"].PropTypes.string},exports["default"]=(0,_reactRouter.withRouter)((0,_reactRedux.connect)(mapStateToProps,mapDispatchToProps)(CampaignAdmin))},{"./CampaignAdminList":13,"components/Breadcrumb/Breadcrumb":"components/Breadcrumb/Breadcrumb","components/FormAction/FormAction":"components/FormAction/FormAction","components/FormBuilder/FormBuilder":"components/FormBuilder/FormBuilder","components/Toolbar/Toolbar":"components/Toolbar/Toolbar",i18n:"i18n","lib/Backend":"lib/Backend","lib/SilverStripeComponent":"lib/SilverStripeComponent",react:"react","react-redux":"react-redux","react-router":"react-router",redux:"redux","state/breadcrumbs/BreadcrumbsActions":"state/breadcrumbs/BreadcrumbsActions"}],12:[function(require,module,exports){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function _defaults(obj,defaults){for(var keys=Object.getOwnPropertyNames(defaults),i=0;i=200&&response.status<300))throw error=new Error(response.statusText),error.response=response,error;return ret=response}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(target){for(var i=1;i1)for(var i=1;i1&&(result=parts[0]+"@",string=parts[1]),string=string.replace(regexSeparators,".");var labels=string.split("."),encoded=map(labels,fn).join(".");return result+encoded}function ucs2decode(string){for(var value,extra,output=[],counter=0,length=string.length;length>counter;)value=string.charCodeAt(counter++),value>=55296&&56319>=value&&length>counter?(extra=string.charCodeAt(counter++),56320==(64512&extra)?output.push(((1023&value)<<10)+(1023&extra)+65536):(output.push(value),counter--)):output.push(value);return output}function ucs2encode(array){return map(array,function(value){var output="";return value>65535&&(value-=65536,output+=stringFromCharCode(value>>>10&1023|55296),value=56320|1023&value),output+=stringFromCharCode(value)}).join("")}function basicToDigit(codePoint){return 10>codePoint-48?codePoint-22:26>codePoint-65?codePoint-65:26>codePoint-97?codePoint-97:base}function digitToBasic(digit,flag){return digit+22+75*(26>digit)-((0!=flag)<<5)}function adapt(delta,numPoints,firstTime){var k=0;for(delta=firstTime?floor(delta/damp):delta>>1,delta+=floor(delta/numPoints);delta>baseMinusTMin*tMax>>1;k+=base)delta=floor(delta/baseMinusTMin);return floor(k+(baseMinusTMin+1)*delta/(delta+skew))}function decode(input){var out,basic,j,index,oldi,w,k,digit,t,baseMinusT,output=[],inputLength=input.length,i=0,n=initialN,bias=initialBias;for(basic=input.lastIndexOf(delimiter),0>basic&&(basic=0),j=0;basic>j;++j)input.charCodeAt(j)>=128&&error("not-basic"),output.push(input.charCodeAt(j));for(index=basic>0?basic+1:0;inputLength>index;){for(oldi=i,w=1,k=base;index>=inputLength&&error("invalid-input"),digit=basicToDigit(input.charCodeAt(index++)),(digit>=base||digit>floor((maxInt-i)/w))&&error("overflow"),i+=digit*w,t=bias>=k?tMin:k>=bias+tMax?tMax:k-bias,!(t>digit);k+=base)baseMinusT=base-t,w>floor(maxInt/baseMinusT)&&error("overflow"),w*=baseMinusT;out=output.length+1,bias=adapt(i-oldi,out,0==oldi),floor(i/out)>maxInt-n&&error("overflow"),n+=floor(i/out),i%=out,output.splice(i++,0,n)}return ucs2encode(output)}function encode(input){var n,delta,handledCPCount,basicLength,bias,j,m,q,k,t,currentValue,inputLength,handledCPCountPlusOne,baseMinusT,qMinusT,output=[];for(input=ucs2decode(input),inputLength=input.length,n=initialN,delta=0,bias=initialBias,j=0;inputLength>j;++j)currentValue=input[j],128>currentValue&&output.push(stringFromCharCode(currentValue));for(handledCPCount=basicLength=output.length,basicLength&&output.push(delimiter);inputLength>handledCPCount;){for(m=maxInt,j=0;inputLength>j;++j)currentValue=input[j],currentValue>=n&&m>currentValue&&(m=currentValue);for(handledCPCountPlusOne=handledCPCount+1,m-n>floor((maxInt-delta)/handledCPCountPlusOne)&&error("overflow"),delta+=(m-n)*handledCPCountPlusOne,n=m,j=0;inputLength>j;++j)if(currentValue=input[j],n>currentValue&&++delta>maxInt&&error("overflow"),currentValue==n){for(q=delta,k=base;t=bias>=k?tMin:k>=bias+tMax?tMax:k-bias,!(t>q);k+=base)qMinusT=q-t,baseMinusT=base-t,output.push(stringFromCharCode(digitToBasic(t+qMinusT%baseMinusT,0))),q=floor(qMinusT/baseMinusT);output.push(stringFromCharCode(digitToBasic(q,0))),bias=adapt(delta,handledCPCountPlusOne,handledCPCount==basicLength),delta=0,++handledCPCount}++delta,++n}return output.join("")}function toUnicode(input){return mapDomain(input,function(string){return regexPunycode.test(string)?decode(string.slice(4).toLowerCase()):string})}function toASCII(input){return mapDomain(input,function(string){return regexNonASCII.test(string)?"xn--"+encode(string):string})}var freeExports="object"==typeof exports&&exports&&!exports.nodeType&&exports,freeModule="object"==typeof module&&module&&!module.nodeType&&module,freeGlobal="object"==typeof global&&global;freeGlobal.global!==freeGlobal&&freeGlobal.window!==freeGlobal&&freeGlobal.self!==freeGlobal||(root=freeGlobal);var punycode,key,maxInt=2147483647,base=36,tMin=1,tMax=26,skew=38,damp=700,initialBias=72,initialN=128,delimiter="-",regexPunycode=/^xn--/,regexNonASCII=/[^\x20-\x7E]/,regexSeparators=/[\x2E\u3002\uFF0E\uFF61]/g,errors={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},baseMinusTMin=base-tMin,floor=Math.floor,stringFromCharCode=String.fromCharCode;if(punycode={version:"1.3.2",ucs2:{decode:ucs2decode,encode:ucs2encode},decode:decode,encode:encode,toASCII:toASCII,toUnicode:toUnicode},"function"==typeof define&&"object"==typeof define.amd&&define.amd)define("punycode",function(){return punycode});else if(freeExports&&freeModule)if(module.exports==freeExports)freeModule.exports=punycode;else for(key in punycode)punycode.hasOwnProperty(key)&&(freeExports[key]=punycode[key]);else root.punycode=punycode}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],36:[function(require,module,exports){"use strict";function hasOwnProperty(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}module.exports=function(qs,sep,eq,options){sep=sep||"&",eq=eq||"=";var obj={};if("string"!=typeof qs||0===qs.length)return obj;var regexp=/\+/g;qs=qs.split(sep);var maxKeys=1e3;options&&"number"==typeof options.maxKeys&&(maxKeys=options.maxKeys);var len=qs.length;maxKeys>0&&len>maxKeys&&(len=maxKeys);for(var i=0;len>i;++i){var kstr,vstr,k,v,x=qs[i].replace(regexp,"%20"),idx=x.indexOf(eq);idx>=0?(kstr=x.substr(0,idx),vstr=x.substr(idx+1)):(kstr=x,vstr=""),k=decodeURIComponent(kstr),v=decodeURIComponent(vstr),hasOwnProperty(obj,k)?isArray(obj[k])?obj[k].push(v):obj[k]=[obj[k],v]:obj[k]=v}return obj};var isArray=Array.isArray||function(xs){return"[object Array]"===Object.prototype.toString.call(xs)}},{}],37:[function(require,module,exports){"use strict";function map(xs,f){if(xs.map)return xs.map(f);for(var res=[],i=0;i0&&"number"!=typeof x[0]):!1}function objEquiv(a,b,opts){var i,key;if(isUndefinedOrNull(a)||isUndefinedOrNull(b))return!1;if(a.prototype!==b.prototype)return!1;if(isArguments(a))return isArguments(b)?(a=pSlice.call(a),b=pSlice.call(b),deepEqual(a,b,opts)):!1;if(isBuffer(a)){if(!isBuffer(b))return!1;if(a.length!==b.length)return!1;for(i=0;i=0;i--)if(ka[i]!=kb[i])return!1;for(i=ka.length-1;i>=0;i--)if(key=ka[i],!deepEqual(a[key],b[key],opts))return!1;return typeof a==typeof b}var pSlice=Array.prototype.slice,objectKeys=require("./lib/keys.js"),isArguments=require("./lib/is_arguments.js"),deepEqual=module.exports=function(actual,expected,opts){return opts||(opts={}),actual===expected?!0:actual instanceof Date&&expected instanceof Date?actual.getTime()===expected.getTime():!actual||!expected||"object"!=typeof actual&&"object"!=typeof expected?opts.strict?actual===expected:actual==expected:objEquiv(actual,expected,opts)}},{"./lib/is_arguments.js":40,"./lib/keys.js":41}],40:[function(require,module,exports){function supported(object){return"[object Arguments]"==Object.prototype.toString.call(object)}function unsupported(object){return object&&"object"==typeof object&&"number"==typeof object.length&&Object.prototype.hasOwnProperty.call(object,"callee")&&!Object.prototype.propertyIsEnumerable.call(object,"callee")||!1}var supportsArgumentsClass="[object Arguments]"==function(){return Object.prototype.toString.call(arguments)}();exports=module.exports=supportsArgumentsClass?supported:unsupported,exports.supported=supported,exports.unsupported=unsupported},{}],41:[function(require,module,exports){function shim(obj){var keys=[];for(var key in obj)keys.push(key);return keys}exports=module.exports="function"==typeof Object.keys?Object.keys:shim,exports.shim=shim},{}],42:[function(require,module,exports){(function(process,global){(function(){"use strict";function lib$es6$promise$utils$$objectOrFunction(x){return"function"==typeof x||"object"==typeof x&&null!==x}function lib$es6$promise$utils$$isFunction(x){return"function"==typeof x}function lib$es6$promise$asap$$setScheduler(scheduleFn){lib$es6$promise$asap$$customSchedulerFn=scheduleFn}function lib$es6$promise$asap$$setAsap(asapFn){lib$es6$promise$asap$$asap=asapFn}function lib$es6$promise$asap$$useNextTick(){return function(){process.nextTick(lib$es6$promise$asap$$flush)}}function lib$es6$promise$asap$$useVertxTimer(){return function(){lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush)}}function lib$es6$promise$asap$$useMutationObserver(){var iterations=0,observer=new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush),node=document.createTextNode("");return observer.observe(node,{characterData:!0}),function(){node.data=iterations=++iterations%2}}function lib$es6$promise$asap$$useMessageChannel(){var channel=new MessageChannel;return channel.port1.onmessage=lib$es6$promise$asap$$flush,function(){channel.port2.postMessage(0)}}function lib$es6$promise$asap$$useSetTimeout(){return function(){setTimeout(lib$es6$promise$asap$$flush,1)}}function lib$es6$promise$asap$$flush(){for(var i=0;lib$es6$promise$asap$$len>i;i+=2){var callback=lib$es6$promise$asap$$queue[i],arg=lib$es6$promise$asap$$queue[i+1];callback(arg), +lib$es6$promise$asap$$queue[i]=void 0,lib$es6$promise$asap$$queue[i+1]=void 0}lib$es6$promise$asap$$len=0}function lib$es6$promise$asap$$attemptVertx(){try{var r=require,vertx=r("vertx");return lib$es6$promise$asap$$vertxNext=vertx.runOnLoop||vertx.runOnContext,lib$es6$promise$asap$$useVertxTimer()}catch(e){return lib$es6$promise$asap$$useSetTimeout()}}function lib$es6$promise$then$$then(onFulfillment,onRejection){var parent=this,state=parent._state;if(state===lib$es6$promise$$internal$$FULFILLED&&!onFulfillment||state===lib$es6$promise$$internal$$REJECTED&&!onRejection)return this;var child=new this.constructor(lib$es6$promise$$internal$$noop),result=parent._result;if(state){var callback=arguments[state-1];lib$es6$promise$asap$$asap(function(){lib$es6$promise$$internal$$invokeCallback(state,child,callback,result)})}else lib$es6$promise$$internal$$subscribe(parent,child,onFulfillment,onRejection);return child}function lib$es6$promise$promise$resolve$$resolve(object){var Constructor=this;if(object&&"object"==typeof object&&object.constructor===Constructor)return object;var promise=new Constructor(lib$es6$promise$$internal$$noop);return lib$es6$promise$$internal$$resolve(promise,object),promise}function lib$es6$promise$$internal$$noop(){}function lib$es6$promise$$internal$$selfFulfillment(){return new TypeError("You cannot resolve a promise with itself")}function lib$es6$promise$$internal$$cannotReturnOwn(){return new TypeError("A promises callback cannot return that same promise.")}function lib$es6$promise$$internal$$getThen(promise){try{return promise.then}catch(error){return lib$es6$promise$$internal$$GET_THEN_ERROR.error=error,lib$es6$promise$$internal$$GET_THEN_ERROR}}function lib$es6$promise$$internal$$tryThen(then,value,fulfillmentHandler,rejectionHandler){try{then.call(value,fulfillmentHandler,rejectionHandler)}catch(e){return e}}function lib$es6$promise$$internal$$handleForeignThenable(promise,thenable,then){lib$es6$promise$asap$$asap(function(promise){var sealed=!1,error=lib$es6$promise$$internal$$tryThen(then,thenable,function(value){sealed||(sealed=!0,thenable!==value?lib$es6$promise$$internal$$resolve(promise,value):lib$es6$promise$$internal$$fulfill(promise,value))},function(reason){sealed||(sealed=!0,lib$es6$promise$$internal$$reject(promise,reason))},"Settle: "+(promise._label||" unknown promise"));!sealed&&error&&(sealed=!0,lib$es6$promise$$internal$$reject(promise,error))},promise)}function lib$es6$promise$$internal$$handleOwnThenable(promise,thenable){thenable._state===lib$es6$promise$$internal$$FULFILLED?lib$es6$promise$$internal$$fulfill(promise,thenable._result):thenable._state===lib$es6$promise$$internal$$REJECTED?lib$es6$promise$$internal$$reject(promise,thenable._result):lib$es6$promise$$internal$$subscribe(thenable,void 0,function(value){lib$es6$promise$$internal$$resolve(promise,value)},function(reason){lib$es6$promise$$internal$$reject(promise,reason)})}function lib$es6$promise$$internal$$handleMaybeThenable(promise,maybeThenable,then){maybeThenable.constructor===promise.constructor&&then===lib$es6$promise$then$$default&&constructor.resolve===lib$es6$promise$promise$resolve$$default?lib$es6$promise$$internal$$handleOwnThenable(promise,maybeThenable):then===lib$es6$promise$$internal$$GET_THEN_ERROR?lib$es6$promise$$internal$$reject(promise,lib$es6$promise$$internal$$GET_THEN_ERROR.error):void 0===then?lib$es6$promise$$internal$$fulfill(promise,maybeThenable):lib$es6$promise$utils$$isFunction(then)?lib$es6$promise$$internal$$handleForeignThenable(promise,maybeThenable,then):lib$es6$promise$$internal$$fulfill(promise,maybeThenable)}function lib$es6$promise$$internal$$resolve(promise,value){promise===value?lib$es6$promise$$internal$$reject(promise,lib$es6$promise$$internal$$selfFulfillment()):lib$es6$promise$utils$$objectOrFunction(value)?lib$es6$promise$$internal$$handleMaybeThenable(promise,value,lib$es6$promise$$internal$$getThen(value)):lib$es6$promise$$internal$$fulfill(promise,value)}function lib$es6$promise$$internal$$publishRejection(promise){promise._onerror&&promise._onerror(promise._result),lib$es6$promise$$internal$$publish(promise)}function lib$es6$promise$$internal$$fulfill(promise,value){promise._state===lib$es6$promise$$internal$$PENDING&&(promise._result=value,promise._state=lib$es6$promise$$internal$$FULFILLED,0!==promise._subscribers.length&&lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish,promise))}function lib$es6$promise$$internal$$reject(promise,reason){promise._state===lib$es6$promise$$internal$$PENDING&&(promise._state=lib$es6$promise$$internal$$REJECTED,promise._result=reason,lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publishRejection,promise))}function lib$es6$promise$$internal$$subscribe(parent,child,onFulfillment,onRejection){var subscribers=parent._subscribers,length=subscribers.length;parent._onerror=null,subscribers[length]=child,subscribers[length+lib$es6$promise$$internal$$FULFILLED]=onFulfillment,subscribers[length+lib$es6$promise$$internal$$REJECTED]=onRejection,0===length&&parent._state&&lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish,parent)}function lib$es6$promise$$internal$$publish(promise){var subscribers=promise._subscribers,settled=promise._state;if(0!==subscribers.length){for(var child,callback,detail=promise._result,i=0;ii;i++)lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]),void 0,onFulfillment,onRejection);return promise}function lib$es6$promise$promise$reject$$reject(reason){var Constructor=this,promise=new Constructor(lib$es6$promise$$internal$$noop);return lib$es6$promise$$internal$$reject(promise,reason),promise}function lib$es6$promise$promise$$needsResolver(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function lib$es6$promise$promise$$needsNew(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function lib$es6$promise$promise$$Promise(resolver){this._id=lib$es6$promise$promise$$counter++,this._state=void 0,this._result=void 0,this._subscribers=[],lib$es6$promise$$internal$$noop!==resolver&&("function"!=typeof resolver&&lib$es6$promise$promise$$needsResolver(),this instanceof lib$es6$promise$promise$$Promise?lib$es6$promise$$internal$$initializePromise(this,resolver):lib$es6$promise$promise$$needsNew())}function lib$es6$promise$enumerator$$Enumerator(Constructor,input){this._instanceConstructor=Constructor,this.promise=new Constructor(lib$es6$promise$$internal$$noop),Array.isArray(input)?(this._input=input,this.length=input.length,this._remaining=input.length,this._result=new Array(this.length),0===this.length?lib$es6$promise$$internal$$fulfill(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&lib$es6$promise$$internal$$fulfill(this.promise,this._result))):lib$es6$promise$$internal$$reject(this.promise,this._validationError())}function lib$es6$promise$polyfill$$polyfill(){var local;if("undefined"!=typeof global)local=global;else if("undefined"!=typeof self)local=self;else try{local=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var P=local.Promise;P&&"[object Promise]"===Object.prototype.toString.call(P.resolve())&&!P.cast||(local.Promise=lib$es6$promise$promise$$default)}var lib$es6$promise$utils$$_isArray;lib$es6$promise$utils$$_isArray=Array.isArray?Array.isArray:function(x){return"[object Array]"===Object.prototype.toString.call(x)};var lib$es6$promise$asap$$vertxNext,lib$es6$promise$asap$$customSchedulerFn,lib$es6$promise$asap$$scheduleFlush,lib$es6$promise$utils$$isArray=lib$es6$promise$utils$$_isArray,lib$es6$promise$asap$$len=0,lib$es6$promise$asap$$asap=function(callback,arg){lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len]=callback,lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len+1]=arg,lib$es6$promise$asap$$len+=2,2===lib$es6$promise$asap$$len&&(lib$es6$promise$asap$$customSchedulerFn?lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush):lib$es6$promise$asap$$scheduleFlush())},lib$es6$promise$asap$$browserWindow="undefined"!=typeof window?window:void 0,lib$es6$promise$asap$$browserGlobal=lib$es6$promise$asap$$browserWindow||{},lib$es6$promise$asap$$BrowserMutationObserver=lib$es6$promise$asap$$browserGlobal.MutationObserver||lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver,lib$es6$promise$asap$$isNode="undefined"!=typeof process&&"[object process]"==={}.toString.call(process),lib$es6$promise$asap$$isWorker="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,lib$es6$promise$asap$$queue=new Array(1e3);lib$es6$promise$asap$$scheduleFlush=lib$es6$promise$asap$$isNode?lib$es6$promise$asap$$useNextTick():lib$es6$promise$asap$$BrowserMutationObserver?lib$es6$promise$asap$$useMutationObserver():lib$es6$promise$asap$$isWorker?lib$es6$promise$asap$$useMessageChannel():void 0===lib$es6$promise$asap$$browserWindow&&"function"==typeof require?lib$es6$promise$asap$$attemptVertx():lib$es6$promise$asap$$useSetTimeout();var lib$es6$promise$then$$default=lib$es6$promise$then$$then,lib$es6$promise$promise$resolve$$default=lib$es6$promise$promise$resolve$$resolve,lib$es6$promise$$internal$$PENDING=void 0,lib$es6$promise$$internal$$FULFILLED=1,lib$es6$promise$$internal$$REJECTED=2,lib$es6$promise$$internal$$GET_THEN_ERROR=new lib$es6$promise$$internal$$ErrorObject,lib$es6$promise$$internal$$TRY_CATCH_ERROR=new lib$es6$promise$$internal$$ErrorObject,lib$es6$promise$promise$all$$default=lib$es6$promise$promise$all$$all,lib$es6$promise$promise$race$$default=lib$es6$promise$promise$race$$race,lib$es6$promise$promise$reject$$default=lib$es6$promise$promise$reject$$reject,lib$es6$promise$promise$$counter=0,lib$es6$promise$promise$$default=lib$es6$promise$promise$$Promise;lib$es6$promise$promise$$Promise.all=lib$es6$promise$promise$all$$default,lib$es6$promise$promise$$Promise.race=lib$es6$promise$promise$race$$default,lib$es6$promise$promise$$Promise.resolve=lib$es6$promise$promise$resolve$$default,lib$es6$promise$promise$$Promise.reject=lib$es6$promise$promise$reject$$default,lib$es6$promise$promise$$Promise._setScheduler=lib$es6$promise$asap$$setScheduler,lib$es6$promise$promise$$Promise._setAsap=lib$es6$promise$asap$$setAsap,lib$es6$promise$promise$$Promise._asap=lib$es6$promise$asap$$asap,lib$es6$promise$promise$$Promise.prototype={constructor:lib$es6$promise$promise$$Promise,then:lib$es6$promise$then$$default,"catch":function(onRejection){return this.then(null,onRejection)}};var lib$es6$promise$enumerator$$default=lib$es6$promise$enumerator$$Enumerator;lib$es6$promise$enumerator$$Enumerator.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},lib$es6$promise$enumerator$$Enumerator.prototype._enumerate=function(){for(var length=this.length,input=this._input,i=0;this._state===lib$es6$promise$$internal$$PENDING&&length>i;i++)this._eachEntry(input[i],i)},lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry=function(entry,i){var c=this._instanceConstructor,resolve=c.resolve;if(resolve===lib$es6$promise$promise$resolve$$default){var then=lib$es6$promise$$internal$$getThen(entry);if(then===lib$es6$promise$then$$default&&entry._state!==lib$es6$promise$$internal$$PENDING)this._settledAt(entry._state,i,entry._result);else if("function"!=typeof then)this._remaining--,this._result[i]=entry;else if(c===lib$es6$promise$promise$$default){var promise=new c(lib$es6$promise$$internal$$noop);lib$es6$promise$$internal$$handleMaybeThenable(promise,entry,then),this._willSettleAt(promise,i)}else this._willSettleAt(new c(function(resolve){resolve(entry)}),i)}else this._willSettleAt(resolve(entry),i)},lib$es6$promise$enumerator$$Enumerator.prototype._settledAt=function(state,i,value){var promise=this.promise;promise._state===lib$es6$promise$$internal$$PENDING&&(this._remaining--,state===lib$es6$promise$$internal$$REJECTED?lib$es6$promise$$internal$$reject(promise,value):this._result[i]=value),0===this._remaining&&lib$es6$promise$$internal$$fulfill(promise,this._result)},lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt=function(promise,i){var enumerator=this;lib$es6$promise$$internal$$subscribe(promise,void 0,function(value){enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED,i,value)},function(reason){enumerator._settledAt(lib$es6$promise$$internal$$REJECTED,i,reason)})};var lib$es6$promise$polyfill$$default=lib$es6$promise$polyfill$$polyfill,lib$es6$promise$umd$$ES6Promise={Promise:lib$es6$promise$promise$$default,polyfill:lib$es6$promise$polyfill$$default};"function"==typeof define&&define.amd?define(function(){return lib$es6$promise$umd$$ES6Promise}):"undefined"!=typeof module&&module.exports?module.exports=lib$es6$promise$umd$$ES6Promise:"undefined"!=typeof this&&(this.ES6Promise=lib$es6$promise$umd$$ES6Promise),lib$es6$promise$polyfill$$default()}).call(this)}).call(this,require("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:34}],43:[function(require,module,exports){"use strict";exports.__esModule=!0;var PUSH="PUSH";exports.PUSH=PUSH;var REPLACE="REPLACE";exports.REPLACE=REPLACE;var POP="POP";exports.POP=POP,exports["default"]={PUSH:PUSH,REPLACE:REPLACE,POP:POP}},{}],44:[function(require,module,exports){"use strict";function loopAsync(turns,work,callback){function done(){return isDone=!0,sync?void(doneArgs=[].concat(_slice.call(arguments))):void callback.apply(this,arguments)}function next(){if(!isDone&&(hasNext=!0,!sync)){for(sync=!0;!isDone&&turns>currentTurn&&hasNext;)hasNext=!1,work.call(this,currentTurn++,next,done);return sync=!1,isDone?void callback.apply(this,doneArgs):void(currentTurn>=turns&&hasNext&&(isDone=!0,callback()))}}var currentTurn=0,isDone=!1,sync=!1,hasNext=!1,doneArgs=void 0;next()}exports.__esModule=!0;var _slice=Array.prototype.slice;exports.loopAsync=loopAsync},{}],45:[function(require,module,exports){(function(process){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function createKey(key){return KeyPrefix+key}function saveState(key,state){try{null==state?window.sessionStorage.removeItem(createKey(key)):window.sessionStorage.setItem(createKey(key),JSON.stringify(state))}catch(error){if(error.name===SecurityError)return void("production"!==process.env.NODE_ENV?_warning2["default"](!1,"[history] Unable to save state; sessionStorage is not available due to security settings"):void 0);if(QuotaExceededErrors.indexOf(error.name)>=0&&0===window.sessionStorage.length)return void("production"!==process.env.NODE_ENV?_warning2["default"](!1,"[history] Unable to save state; sessionStorage is not available in Safari private mode"):void 0);throw error}}function readState(key){var json=void 0;try{json=window.sessionStorage.getItem(createKey(key))}catch(error){if(error.name===SecurityError)return"production"!==process.env.NODE_ENV?_warning2["default"](!1,"[history] Unable to read state; sessionStorage is not available due to security settings"):void 0,null}if(json)try{return JSON.parse(json)}catch(error){}return null}exports.__esModule=!0,exports.saveState=saveState,exports.readState=readState;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning),KeyPrefix="@@History/",QuotaExceededErrors=["QuotaExceededError","QUOTA_EXCEEDED_ERR"],SecurityError="SecurityError"}).call(this,require("_process"))},{_process:34,warning:56}],46:[function(require,module,exports){"use strict";function addEventListener(node,event,listener){node.addEventListener?node.addEventListener(event,listener,!1):node.attachEvent("on"+event,listener)}function removeEventListener(node,event,listener){node.removeEventListener?node.removeEventListener(event,listener,!1):node.detachEvent("on"+event,listener)}function getHashPath(){return window.location.href.split("#")[1]||""}function replaceHashPath(path){window.location.replace(window.location.pathname+window.location.search+"#"+path)}function getWindowPath(){return window.location.pathname+window.location.search+window.location.hash}function go(n){n&&window.history.go(n)}function getUserConfirmation(message,callback){callback(window.confirm(message))}function supportsHistory(){var ua=navigator.userAgent;return-1===ua.indexOf("Android 2.")&&-1===ua.indexOf("Android 4.0")||-1===ua.indexOf("Mobile Safari")||-1!==ua.indexOf("Chrome")||-1!==ua.indexOf("Windows Phone")?window.history&&"pushState"in window.history:!1}function supportsGoWithoutReloadUsingHash(){var ua=navigator.userAgent;return-1===ua.indexOf("Firefox")}exports.__esModule=!0,exports.addEventListener=addEventListener,exports.removeEventListener=removeEventListener,exports.getHashPath=getHashPath,exports.replaceHashPath=replaceHashPath,exports.getWindowPath=getWindowPath,exports.go=go,exports.getUserConfirmation=getUserConfirmation,exports.supportsHistory=supportsHistory,exports.supportsGoWithoutReloadUsingHash=supportsGoWithoutReloadUsingHash},{}],47:[function(require,module,exports){"use strict";exports.__esModule=!0;var canUseDOM=!("undefined"==typeof window||!window.document||!window.document.createElement);exports.canUseDOM=canUseDOM},{}],48:[function(require,module,exports){(function(process){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function extractPath(string){var match=string.match(/^https?:\/\/[^\/]*/);return null==match?string:string.substring(match[0].length)}function parsePath(path){var pathname=extractPath(path),search="",hash="";"production"!==process.env.NODE_ENV?_warning2["default"](path===pathname,'A path must be pathname + search + hash only, not a fully qualified URL like "%s"',path):void 0;var hashIndex=pathname.indexOf("#");-1!==hashIndex&&(hash=pathname.substring(hashIndex),pathname=pathname.substring(0,hashIndex));var searchIndex=pathname.indexOf("?");return-1!==searchIndex&&(search=pathname.substring(searchIndex),pathname=pathname.substring(0,searchIndex)),""===pathname&&(pathname="/"),{pathname:pathname,search:search,hash:hash}}exports.__esModule=!0,exports.extractPath=extractPath,exports.parsePath=parsePath;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning)}).call(this,require("_process"))},{_process:34,warning:56}],49:[function(require,module,exports){(function(process){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function createBrowserHistory(){function getCurrentLocation(historyState){try{historyState=historyState||window.history.state||{}}catch(e){historyState={}}var path=_DOMUtils.getWindowPath(),_historyState=historyState,key=_historyState.key,state=void 0;key?state=_DOMStateStorage.readState(key):(state=null,key=history.createKey(),isSupported&&window.history.replaceState(_extends({},historyState,{key:key}),null));var location=_PathUtils.parsePath(path);return history.createLocation(_extends({},location,{state:state}),void 0,key)}function startPopStateListener(_ref){function popStateListener(event){void 0!==event.state&&transitionTo(getCurrentLocation(event.state))}var transitionTo=_ref.transitionTo;return _DOMUtils.addEventListener(window,"popstate",popStateListener),function(){_DOMUtils.removeEventListener(window,"popstate",popStateListener)}}function finishTransition(location){var basename=location.basename,pathname=location.pathname,search=location.search,hash=location.hash,state=location.state,action=location.action,key=location.key;if(action!==_Actions.POP){_DOMStateStorage.saveState(key,state);var path=(basename||"")+pathname+search+hash,historyState={key:key};if(action===_Actions.PUSH){if(useRefresh)return window.location.href=path,!1;window.history.pushState(historyState,null,path)}else{if(useRefresh)return window.location.replace(path),!1;window.history.replaceState(historyState,null,path)}}}function listenBefore(listener){1===++listenerCount&&(stopPopStateListener=startPopStateListener(history));var unlisten=history.listenBefore(listener);return function(){unlisten(),0===--listenerCount&&stopPopStateListener()}}function listen(listener){1===++listenerCount&&(stopPopStateListener=startPopStateListener(history));var unlisten=history.listen(listener);return function(){unlisten(),0===--listenerCount&&stopPopStateListener()}}function registerTransitionHook(hook){1===++listenerCount&&(stopPopStateListener=startPopStateListener(history)),history.registerTransitionHook(hook)}function unregisterTransitionHook(hook){history.unregisterTransitionHook(hook),0===--listenerCount&&stopPopStateListener()}var options=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];_ExecutionEnvironment.canUseDOM?void 0:"production"!==process.env.NODE_ENV?_invariant2["default"](!1,"Browser history needs a DOM"):_invariant2["default"](!1);var forceRefresh=options.forceRefresh,isSupported=_DOMUtils.supportsHistory(),useRefresh=!isSupported||forceRefresh,history=_createDOMHistory2["default"](_extends({},options,{getCurrentLocation:getCurrentLocation,finishTransition:finishTransition,saveState:_DOMStateStorage.saveState})),listenerCount=0,stopPopStateListener=void 0;return _extends({},history,{listenBefore:listenBefore,listen:listen,registerTransitionHook:registerTransitionHook,unregisterTransitionHook:unregisterTransitionHook})}exports.__esModule=!0;var _extends=Object.assign||function(target){for(var i=1;iindex;++index){var item=argv[index],type=typeOf(item);if("object"===type)for(var key in item){var sitem=clone?Public.clone(item[key]):item[key];recursive?result[key]=merge_recursive(result[key],sitem):result[key]=sitem}}return result}function typeOf(input){return{}.toString.call(input).slice(8,-1).toLowerCase()}var Public=function(clone){return merge(clone===!0,!1,arguments)},publicName="merge";Public.recursive=function(clone){return merge(clone===!0,!0,arguments)},Public.clone=function(input){var index,size,output=input,type=typeOf(input);if("array"===type)for(output=[],size=input.length,index=0;size>index;++index)output[index]=Public.clone(input[index]);else if("object"===type){output={};for(index in input)output[index]=Public.clone(input[index])}return output},isNode?module.exports=Public:window[publicName]=Public}("object"==typeof module&&module&&"object"==typeof module.exports&&module.exports)},{}],59:[function(require,module,exports){"use strict";var Stringify=require("./stringify"),Parse=require("./parse");module.exports={stringify:Stringify,parse:Parse}},{"./parse":60,"./stringify":61}],60:[function(require,module,exports){"use strict";var Utils=require("./utils"),internals={delimiter:"&",depth:5,arrayLimit:20,parameterLimit:1e3,strictNullHandling:!1,plainObjects:!1,allowPrototypes:!1,allowDots:!1};internals.parseValues=function(str,options){for(var obj={},parts=str.split(options.delimiter,options.parameterLimit===1/0?void 0:options.parameterLimit),i=0;i=0&&options.parseArrays&&index<=options.arrayLimit?(obj=[],obj[index]=internals.parseObject(chain,val,options)):obj[cleanRoot]=internals.parseObject(chain,val,options)}return obj},internals.parseKeys=function(givenKey,val,options){if(givenKey){var key=options.allowDots?givenKey.replace(/\.([^\.\[]+)/g,"[$1]"):givenKey,parent=/^([^\[\]]*)/,child=/(\[[^\[\]]*\])/g,segment=parent.exec(key),keys=[];if(segment[1]){if(!options.plainObjects&&Object.prototype.hasOwnProperty(segment[1])&&!options.allowPrototypes)return;keys.push(segment[1])}for(var i=0;null!==(segment=child.exec(key))&&ii;++i)array[i]="%"+((16>i?"0":"")+i.toString(16)).toUpperCase();return array}();exports.arrayToObject=function(source,options){for(var obj=options.plainObjects?Object.create(null):{},i=0;i=48&&57>=c||c>=65&&90>=c||c>=97&&122>=c?out+=string.charAt(i):128>c?out+=hexTable[c]:2048>c?out+=hexTable[192|c>>6]+hexTable[128|63&c]:55296>c||c>=57344?out+=hexTable[224|c>>12]+hexTable[128|c>>6&63]+hexTable[128|63&c]:(i+=1,c=65536+((1023&c)<<10|1023&string.charCodeAt(i)),out+=hexTable[240|c>>18]+hexTable[128|c>>12&63]+hexTable[128|c>>6&63]+hexTable[128|63&c])}return out},exports.compact=function(obj,references){if("object"!=typeof obj||null===obj)return obj;var refs=references||[],lookup=refs.indexOf(obj);if(-1!==lookup)return refs[lookup];if(refs.push(obj),Array.isArray(obj)){for(var compacted=[],i=0;i",'"',"`"," ","\r","\n"," "],unwise=["{","}","|","\\","^","`"].concat(delims),autoEscape=["'"].concat(unwise),nonHostChars=["%","/","?",";","#"].concat(autoEscape),hostEndingChars=["/","?","#"],hostnameMaxLen=255,hostnamePartPattern=/^[+a-z0-9A-Z_-]{0,63}$/,hostnamePartStart=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,unsafeProtocol={javascript:!0,"javascript:":!0},hostlessProtocol={javascript:!0,"javascript:":!0},slashedProtocol={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},querystring=require("querystring");Url.prototype.parse=function(url,parseQueryString,slashesDenoteHost){if(!util.isString(url))throw new TypeError("Parameter 'url' must be a string, not "+typeof url);var queryIndex=url.indexOf("?"),splitter=-1!==queryIndex&&queryIndexhec)&&(hostEnd=hec)}var auth,atSign;atSign=-1===hostEnd?rest.lastIndexOf("@"):rest.lastIndexOf("@",hostEnd),-1!==atSign&&(auth=rest.slice(0,atSign),rest=rest.slice(atSign+1),this.auth=decodeURIComponent(auth)),hostEnd=-1;for(var i=0;ihec)&&(hostEnd=hec)}-1===hostEnd&&(hostEnd=rest.length),this.host=rest.slice(0,hostEnd),rest=rest.slice(hostEnd),this.parseHost(),this.hostname=this.hostname||"";var ipv6Hostname="["===this.hostname[0]&&"]"===this.hostname[this.hostname.length-1];if(!ipv6Hostname)for(var hostparts=this.hostname.split(/\./),i=0,l=hostparts.length;l>i;i++){var part=hostparts[i];if(part&&!part.match(hostnamePartPattern)){for(var newpart="",j=0,k=part.length;k>j;j++)newpart+=part.charCodeAt(j)>127?"x":part[j];if(!newpart.match(hostnamePartPattern)){var validParts=hostparts.slice(0,i),notHost=hostparts.slice(i+1),bit=part.match(hostnamePartStart);bit&&(validParts.push(bit[1]),notHost.unshift(bit[2])),notHost.length&&(rest="/"+notHost.join(".")+rest),this.hostname=validParts.join(".");break}}}this.hostname.length>hostnameMaxLen?this.hostname="":this.hostname=this.hostname.toLowerCase(),ipv6Hostname||(this.hostname=punycode.toASCII(this.hostname));var p=this.port?":"+this.port:"",h=this.hostname||"";this.host=h+p,this.href+=this.host,ipv6Hostname&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==rest[0]&&(rest="/"+rest))}if(!unsafeProtocol[lowerProto])for(var i=0,l=autoEscape.length;l>i;i++){var ae=autoEscape[i];if(-1!==rest.indexOf(ae)){var esc=encodeURIComponent(ae);esc===ae&&(esc=escape(ae)),rest=rest.split(ae).join(esc)}}var hash=rest.indexOf("#");-1!==hash&&(this.hash=rest.substr(hash),rest=rest.slice(0,hash));var qm=rest.indexOf("?");if(-1!==qm?(this.search=rest.substr(qm),this.query=rest.substr(qm+1),parseQueryString&&(this.query=querystring.parse(this.query)),rest=rest.slice(0,qm)):parseQueryString&&(this.search="",this.query={}),rest&&(this.pathname=rest),slashedProtocol[lowerProto]&&this.hostname&&!this.pathname&&(this.pathname="/"),this.pathname||this.search){var p=this.pathname||"",s=this.search||"";this.path=p+s}return this.href=this.format(),this},Url.prototype.format=function(){var auth=this.auth||"";auth&&(auth=encodeURIComponent(auth),auth=auth.replace(/%3A/i,":"),auth+="@");var protocol=this.protocol||"",pathname=this.pathname||"",hash=this.hash||"",host=!1,query="";this.host?host=auth+this.host:this.hostname&&(host=auth+(-1===this.hostname.indexOf(":")?this.hostname:"["+this.hostname+"]"),this.port&&(host+=":"+this.port)),this.query&&util.isObject(this.query)&&Object.keys(this.query).length&&(query=querystring.stringify(this.query));var search=this.search||query&&"?"+query||"";return protocol&&":"!==protocol.substr(-1)&&(protocol+=":"),this.slashes||(!protocol||slashedProtocol[protocol])&&host!==!1?(host="//"+(host||""),pathname&&"/"!==pathname.charAt(0)&&(pathname="/"+pathname)):host||(host=""),hash&&"#"!==hash.charAt(0)&&(hash="#"+hash),search&&"?"!==search.charAt(0)&&(search="?"+search),pathname=pathname.replace(/[?#]/g,function(match){return encodeURIComponent(match)}),search=search.replace("#","%23"),protocol+host+pathname+search+hash},Url.prototype.resolve=function(relative){return this.resolveObject(urlParse(relative,!1,!0)).format()},Url.prototype.resolveObject=function(relative){if(util.isString(relative)){var rel=new Url;rel.parse(relative,!1,!0),relative=rel}for(var result=new Url,tkeys=Object.keys(this),tk=0;tk0?result.host.split("@"):!1;authInHost&&(result.auth=authInHost.shift(),result.host=result.hostname=authInHost.shift())}return result.search=relative.search,result.query=relative.query,util.isNull(result.pathname)&&util.isNull(result.search)||(result.path=(result.pathname?result.pathname:"")+(result.search?result.search:"")),result.href=result.format(),result}if(!srcPath.length)return result.pathname=null,result.search?result.path="/"+result.search:result.path=null,result.href=result.format(),result;for(var last=srcPath.slice(-1)[0],hasTrailingSlash=(result.host||relative.host||srcPath.length>1)&&("."===last||".."===last)||""===last,up=0,i=srcPath.length;i>=0;i--)last=srcPath[i],"."===last?srcPath.splice(i,1):".."===last?(srcPath.splice(i,1),up++):up&&(srcPath.splice(i,1),up--);if(!mustEndAbs&&!removeAllDots)for(;up--;up)srcPath.unshift("..");!mustEndAbs||""===srcPath[0]||srcPath[0]&&"/"===srcPath[0].charAt(0)||srcPath.unshift(""),hasTrailingSlash&&"/"!==srcPath.join("/").substr(-1)&&srcPath.push("");var isAbsolute=""===srcPath[0]||srcPath[0]&&"/"===srcPath[0].charAt(0);if(psychotic){result.hostname=result.host=isAbsolute?"":srcPath.length?srcPath.shift():"";var authInHost=result.host&&result.host.indexOf("@")>0?result.host.split("@"):!1;authInHost&&(result.auth=authInHost.shift(),result.host=result.hostname=authInHost.shift())}return mustEndAbs=mustEndAbs||result.host&&srcPath.length,mustEndAbs&&!isAbsolute&&srcPath.unshift(""),srcPath.length?result.pathname=srcPath.join("/"):(result.pathname=null,result.path=null),util.isNull(result.pathname)&&util.isNull(result.search)||(result.path=(result.pathname?result.pathname:"")+(result.search?result.search:"")),result.auth=relative.auth||result.auth,result.slashes=result.slashes||relative.slashes,result.href=result.format(),result},Url.prototype.parseHost=function(){var host=this.host,port=portPattern.exec(host);port&&(port=port[0],":"!==port&&(this.port=port.substr(1)),host=host.substr(0,host.length-port.length)),host&&(this.hostname=host)}},{"./util":65,punycode:35,querystring:38}],65:[function(require,module,exports){"use strict";module.exports={isString:function(arg){return"string"==typeof arg},isObject:function(arg){return"object"==typeof arg&&null!==arg},isNull:function(arg){return null===arg},isNullOrUndefined:function(arg){return null==arg}}},{}],66:[function(require,module,exports){!function(self){"use strict";function normalizeName(name){if("string"!=typeof name&&(name=String(name)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name))throw new TypeError("Invalid character in header field name");return name.toLowerCase()}function normalizeValue(value){return"string"!=typeof value&&(value=String(value)),value}function Headers(headers){this.map={},headers instanceof Headers?headers.forEach(function(value,name){this.append(name,value)},this):headers&&Object.getOwnPropertyNames(headers).forEach(function(name){this.append(name,headers[name])},this)}function consumed(body){return body.bodyUsed?Promise.reject(new TypeError("Already read")):void(body.bodyUsed=!0)}function fileReaderReady(reader){return new Promise(function(resolve,reject){reader.onload=function(){resolve(reader.result)},reader.onerror=function(){reject(reader.error)}})}function readBlobAsArrayBuffer(blob){var reader=new FileReader;return reader.readAsArrayBuffer(blob),fileReaderReady(reader)}function readBlobAsText(blob){var reader=new FileReader;return reader.readAsText(blob),fileReaderReady(reader)}function Body(){return this.bodyUsed=!1,this._initBody=function(body){if(this._bodyInit=body, "string"==typeof body)this._bodyText=body;else if(support.blob&&Blob.prototype.isPrototypeOf(body))this._bodyBlob=body;else if(support.formData&&FormData.prototype.isPrototypeOf(body))this._bodyFormData=body;else if(body){if(!support.arrayBuffer||!ArrayBuffer.prototype.isPrototypeOf(body))throw new Error("unsupported BodyInit type")}else this._bodyText="";this.headers.get("content-type")||("string"==typeof body?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type&&this.headers.set("content-type",this._bodyBlob.type))},support.blob?(this.blob=function(){var rejected=consumed(this);if(rejected)return rejected;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this.blob().then(readBlobAsArrayBuffer)},this.text=function(){var rejected=consumed(this);if(rejected)return rejected;if(this._bodyBlob)return readBlobAsText(this._bodyBlob);if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)}):this.text=function(){var rejected=consumed(this);return rejected?rejected:Promise.resolve(this._bodyText)},support.formData&&(this.formData=function(){return this.text().then(decode)}),this.json=function(){return this.text().then(JSON.parse)},this}function normalizeMethod(method){var upcased=method.toUpperCase();return methods.indexOf(upcased)>-1?upcased:method}function Request(input,options){options=options||{};var body=options.body;if(Request.prototype.isPrototypeOf(input)){if(input.bodyUsed)throw new TypeError("Already read");this.url=input.url,this.credentials=input.credentials,options.headers||(this.headers=new Headers(input.headers)),this.method=input.method,this.mode=input.mode,body||(body=input._bodyInit,input.bodyUsed=!0)}else this.url=input;if(this.credentials=options.credentials||this.credentials||"omit",!options.headers&&this.headers||(this.headers=new Headers(options.headers)),this.method=normalizeMethod(options.method||this.method||"GET"),this.mode=options.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&body)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(body)}function decode(body){var form=new FormData;return body.trim().split("&").forEach(function(bytes){if(bytes){var split=bytes.split("="),name=split.shift().replace(/\+/g," "),value=split.join("=").replace(/\+/g," ");form.append(decodeURIComponent(name),decodeURIComponent(value))}}),form}function headers(xhr){var head=new Headers,pairs=xhr.getAllResponseHeaders().trim().split("\n");return pairs.forEach(function(header){var split=header.trim().split(":"),key=split.shift().trim(),value=split.join(":").trim();head.append(key,value)}),head}function Response(bodyInit,options){options||(options={}),this.type="default",this.status=options.status,this.ok=this.status>=200&&this.status<300,this.statusText=options.statusText,this.headers=options.headers instanceof Headers?options.headers:new Headers(options.headers),this.url=options.url||"",this._initBody(bodyInit)}if(!self.fetch){Headers.prototype.append=function(name,value){name=normalizeName(name),value=normalizeValue(value);var list=this.map[name];list||(list=[],this.map[name]=list),list.push(value)},Headers.prototype["delete"]=function(name){delete this.map[normalizeName(name)]},Headers.prototype.get=function(name){var values=this.map[normalizeName(name)];return values?values[0]:null},Headers.prototype.getAll=function(name){return this.map[normalizeName(name)]||[]},Headers.prototype.has=function(name){return this.map.hasOwnProperty(normalizeName(name))},Headers.prototype.set=function(name,value){this.map[normalizeName(name)]=[normalizeValue(value)]},Headers.prototype.forEach=function(callback,thisArg){Object.getOwnPropertyNames(this.map).forEach(function(name){this.map[name].forEach(function(value){callback.call(thisArg,value,name,this)},this)},this)};var support={blob:"FileReader"in self&&"Blob"in self&&function(){try{return new Blob,!0}catch(e){return!1}}(),formData:"FormData"in self,arrayBuffer:"ArrayBuffer"in self},methods=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];Request.prototype.clone=function(){return new Request(this)},Body.call(Request.prototype),Body.call(Response.prototype),Response.prototype.clone=function(){return new Response(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new Headers(this.headers),url:this.url})},Response.error=function(){var response=new Response(null,{status:0,statusText:""});return response.type="error",response};var redirectStatuses=[301,302,303,307,308];Response.redirect=function(url,status){if(-1===redirectStatuses.indexOf(status))throw new RangeError("Invalid status code");return new Response(null,{status:status,headers:{location:url}})},self.Headers=Headers,self.Request=Request,self.Response=Response,self.fetch=function(input,init){return new Promise(function(resolve,reject){function responseURL(){return"responseURL"in xhr?xhr.responseURL:/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())?xhr.getResponseHeader("X-Request-URL"):void 0}var request;request=Request.prototype.isPrototypeOf(input)&&!init?input:new Request(input,init);var xhr=new XMLHttpRequest;xhr.onload=function(){var status=1223===xhr.status?204:xhr.status;if(100>status||status>599)return void reject(new TypeError("Network request failed"));var options={status:status,statusText:xhr.statusText,headers:headers(xhr),url:responseURL()},body="response"in xhr?xhr.response:xhr.responseText;resolve(new Response(body,options))},xhr.onerror=function(){reject(new TypeError("Network request failed"))},xhr.open(request.method,request.url,!0),"include"===request.credentials&&(xhr.withCredentials=!0),"responseType"in xhr&&support.blob&&(xhr.responseType="blob"),request.headers.forEach(function(value,name){xhr.setRequestHeader(name,value)}),xhr.send("undefined"==typeof request._bodyInit?null:request._bodyInit)})},self.fetch.polyfill=!0}}("undefined"!=typeof self?self:this)},{}]},{},[2]); //# sourceMappingURL=bundle-framework.js.map diff --git a/admin/client/src/containers/CampaignAdmin/CampaignAdminList.js b/admin/client/src/containers/CampaignAdmin/CampaignAdminList.js index ef7b80d0b..f574449ff 100644 --- a/admin/client/src/containers/CampaignAdmin/CampaignAdminList.js +++ b/admin/client/src/containers/CampaignAdmin/CampaignAdminList.js @@ -134,7 +134,7 @@ class CampaignAdminList extends SilverStripeComponent { // Set body const pagesLink = [ this.props.config.baseUrl, - this.props.config.sections.CMSPagesController.url, + this.props.config.sections['SilverStripe\\CMS\\Controllers\\CMSPagesController'].url, ].join('/'); const body = accordionBlocks.length ? ({accordionBlocks}) diff --git a/admin/code/CMSBatchAction.php b/admin/code/CMSBatchAction.php index 0798119d8..f3ca3fd8f 100644 --- a/admin/code/CMSBatchAction.php +++ b/admin/code/CMSBatchAction.php @@ -19,7 +19,7 @@ use SilverStripe\ORM\Versioning\Versioned; */ abstract class CMSBatchAction extends Object { - protected $managedClass = 'SiteTree'; + protected $managedClass = 'SilverStripe\\CMS\\Model\\SiteTree'; /** * The the text to show in the dropdown for this action diff --git a/admin/code/CMSBatchActionHandler.php b/admin/code/CMSBatchActionHandler.php index 3028b31a1..8f2f21074 100644 --- a/admin/code/CMSBatchActionHandler.php +++ b/admin/code/CMSBatchActionHandler.php @@ -46,7 +46,7 @@ class CMSBatchActionHandler extends RequestHandler { * by any batch changes. Needs to be set in the actual {@link CMSBatchAction} * implementations as well. */ - protected $recordClass = 'SiteTree'; + protected $recordClass = 'SilverStripe\\CMS\\Model\\SiteTree'; /** * @param Controller $parentController @@ -72,7 +72,7 @@ class CMSBatchActionHandler extends RequestHandler { * @param string $batchActionClass The name of the CMSBatchAction subclass to register * @param string $recordClass */ - public static function register($urlSegment, $batchActionClass, $recordClass = 'SiteTree') { + public static function register($urlSegment, $batchActionClass, $recordClass = 'SilverStripe\\CMS\\Model\\SiteTree') { if(is_subclass_of($batchActionClass, 'CMSBatchAction')) { Config::inst()->update( 'CMSBatchActionHandler', diff --git a/admin/code/CMSMenu.php b/admin/code/CMSMenu.php index 35f0ea039..3d25d0d0d 100644 --- a/admin/code/CMSMenu.php +++ b/admin/code/CMSMenu.php @@ -323,7 +323,8 @@ CMSMenu extends Object implements IteratorAggregate, i18nEntityProvider { if(!$root) { $root = 'LeftAndMain'; } - $abstractClasses = ['LeftAndMain', 'CMSMain']; + /** @todo Make these actual abstract classes */ + $abstractClasses = ['LeftAndMain', 'SilverStripe\\CMS\\Controllers\\CMSMain']; $subClasses = array_values(ClassInfo::subclassesFor($root)); foreach($subClasses as $className) { if($recursive && $className != $root) { diff --git a/admin/code/LeftAndMain.php b/admin/code/LeftAndMain.php index 4026b30c7..3b928e25d 100644 --- a/admin/code/LeftAndMain.php +++ b/admin/code/LeftAndMain.php @@ -5,6 +5,8 @@ * @subpackage admin */ +use SilverStripe\CMS\Controllers\CMSPageEditController; +use SilverStripe\CMS\Controllers\CMSPagesController; use SilverStripe\Forms\Schema\FormSchema; use SilverStripe\ORM\SS_List; use SilverStripe\ORM\Versioning\Versioned; @@ -21,6 +23,10 @@ use SilverStripe\Security\Permission; use SilverStripe\Security\Security; use SilverStripe\Security\PermissionProvider; use SilverStripe\View\ThemeResourceLoader; +use SilverStripe\CMS\Model\SiteTree; +use SilverStripe\CMS\Model\VirtualPage; +use SilverStripe\CMS\Controllers\SilverStripeNavigator; + /** @@ -1036,14 +1042,19 @@ class LeftAndMain extends Controller implements PermissionProvider { if($currentPage) $obj->markToExpose($currentPage); // NOTE: SiteTree/CMSMain coupling :-( - if(class_exists('SiteTree')) { - SiteTree::prepopulate_permission_cache('CanEditType', $obj->markedNodeIDs(), - 'SiteTree::can_edit_multiple'); + if(class_exists('SilverStripe\\CMS\\Model\\SiteTree')) { + SiteTree::prepopulate_permission_cache( + 'CanEditType', + $obj->markedNodeIDs(), + 'SilverStripe\\CMS\\Model\\SiteTree::can_edit_multiple' + ); } // getChildrenAsUL is a flexible and complex way of traversing the tree $controller = $this; - $recordController = ($this->stat('tree_class') == 'SiteTree') ? singleton('CMSPageEditController') : $this; + $recordController = ($this->stat('tree_class') == 'SilverStripe\\CMS\\Model\\SiteTree') + ? CMSPageEditController::singleton() + : $this; $titleFn = function(&$child, $numChildrenMethod) use(&$controller, &$recordController, $filter) { $link = Controller::join_links($recordController->Link("show"), $child->ID); $node = LeftAndMain_TreeNode::create($child, $link, $controller->isCurrentPage($child), $numChildrenMethod, $filter); @@ -1056,23 +1067,27 @@ class LeftAndMain extends Controller implements PermissionProvider { $nodeThresholdLeaf = Config::inst()->get('SilverStripe\\ORM\\Hierarchy\\Hierarchy', 'node_threshold_leaf'); if($nodeThresholdLeaf && !$filterFunction) { $nodeCountCallback = function($parent, $numChildren) use(&$controller, $className, $nodeThresholdLeaf) { - if($className == 'SiteTree' && $parent->ID && $numChildren > $nodeThresholdLeaf) { - return sprintf( - '
  • ' - . '%s (%s)' - . '
', - _t('LeftAndMain.TooManyPages', 'Too many pages'), - Controller::join_links( - $controller->LinkWithSearch($controller->Link()), ' - ?view=list&ParentID=' . $parent->ID - ), - _t( - 'LeftAndMain.ShowAsList', - 'show as list', - 'Show large amount of pages in list instead of tree view' - ) - ); + if ($className !== 'SilverStripe\\CMS\\Model\\SiteTree' + || !$parent->ID + || $numChildren >= $nodeThresholdLeaf + ) { + return null; } + return sprintf( + '
  • ' + . '%s (%s)' + . '
', + _t('LeftAndMain.TooManyPages', 'Too many pages'), + Controller::join_links( + $controller->LinkWithSearch($controller->Link()), ' + ?view=list&ParentID=' . $parent->ID + ), + _t( + 'LeftAndMain.ShowAsList', + 'show as list', + 'Show large amount of pages in list instead of tree view' + ) + ); }; } else { $nodeCountCallback = null; @@ -1089,7 +1104,7 @@ class LeftAndMain extends Controller implements PermissionProvider { $html = $obj->getChildrenAsUL( "", $titleFn, - singleton('CMSPagesController'), + CMSPagesController::singleton(), true, $childrenMethod, $numChildrenMethod, @@ -1160,8 +1175,8 @@ class LeftAndMain extends Controller implements PermissionProvider { $record = $this->getRecord($id); if(!$record) continue; // In case a page is no longer available - $recordController = ($this->stat('tree_class') == 'SiteTree') - ? singleton('CMSPageEditController') + $recordController = ($this->stat('tree_class') == 'SilverStripe\\CMS\\Model\\SiteTree') + ? CMSPageEditController::singleton() : $this; // Find the next & previous nodes, for proper positioning (Sort isn't good enough - it's not a raw offset) @@ -1312,7 +1327,7 @@ class LeftAndMain extends Controller implements PermissionProvider { $id = $request->requestVar('ID'); $parentID = $request->requestVar('ParentID'); - if($className == 'SiteTree' && $page = DataObject::get_by_id('Page', $id)){ + if($className == 'SilverStripe\\CMS\\Model\\SiteTree' && $page = DataObject::get_by_id('Page', $id)){ $root = $page->getParentType(); if(($parentID == '0' || $root == 'root') && !SiteConfig::current_site_config()->canCreateTopLevel()){ $this->getResponse()->setStatusCode( @@ -1351,7 +1366,7 @@ class LeftAndMain extends Controller implements PermissionProvider { ); // Update all dependent pages - if(class_exists('VirtualPage')) { + if(class_exists('SilverStripe\\CMS\\Model\\VirtualPage')) { $virtualPages = VirtualPage::get()->filter("CopyContentFromID", $node->ID); foreach($virtualPages as $virtualPage) { $statusUpdates['modified'][$virtualPage->ID] = array( @@ -1462,6 +1477,7 @@ class LeftAndMain extends Controller implements PermissionProvider { // Added in-line to the form, but plucked into different view by frontend scripts. if(in_array('CMSPreviewable', class_implements($record))) { + /** @skipUpgrade */ $navField = new LiteralField('SilverStripeNavigator', $this->getSilverStripeNavigator()); $navField->setAllowHTML(true); $fields->push($navField); @@ -2103,7 +2119,7 @@ class LeftAndMainMarkingFilter { return new SQLSelect( array("ParentID", "ID"), - 'SiteTree', + 'SilverStripe\\CMS\\Model\\SiteTree', $where ); } diff --git a/admin/code/ModelAdmin.php b/admin/code/ModelAdmin.php index 63426a0bf..f02c88ca3 100644 --- a/admin/code/ModelAdmin.php +++ b/admin/code/ModelAdmin.php @@ -190,6 +190,7 @@ abstract class ModelAdmin extends LeftAndMain { */ public function SearchForm() { $context = $this->getSearchContext(); + /** @skipUpgrade */ $form = new Form($this, "SearchForm", $context->getSearchFields(), new FieldList( diff --git a/core/ClassInfo.php b/core/ClassInfo.php index cbe2146b1..aa923a559 100644 --- a/core/ClassInfo.php +++ b/core/ClassInfo.php @@ -68,12 +68,16 @@ class ClassInfo { * types that don't exist as implemented classes. By default these are excluded. * @return array List of subclasses */ - public static function getValidSubClasses($class = 'SiteTree', $includeUnbacked = false) { + public static function getValidSubClasses($class = 'SilverStripe\\CMS\\Model\\SiteTree', $includeUnbacked = false) { if(is_string($class) && !class_exists($class)) return array(); $class = self::class_name($class); - $classes = DB::get_schema()->enumValuesForField($class, 'ClassName'); - if (!$includeUnbacked) $classes = array_filter($classes, array('ClassInfo', 'exists')); + if ($includeUnbacked) { + $table = DataObject::getSchema()->tableName($class); + $classes = DB::get_schema()->enumValuesForField($table, 'ClassName'); + } else { + $classes = static::subclassesFor($class); + } return $classes; } diff --git a/dev/SapphireTest.php b/dev/SapphireTest.php index c16269cb5..a1af75ab6 100644 --- a/dev/SapphireTest.php +++ b/dev/SapphireTest.php @@ -15,6 +15,9 @@ use SilverStripe\Security\Group; use SilverStripe\Security\Permission; use SilverStripe\View\ThemeResourceLoader; use SilverStripe\View\ThemeManifest; +use SilverStripe\CMS\Controllers\RootURLController; +use SilverStripe\CMS\Model\SiteTree; + /** * Test case class for the Sapphire framework. @@ -218,11 +221,11 @@ class SapphireTest extends PHPUnit_Framework_TestCase { Member::set_password_validator(null); Config::inst()->update('Cookie', 'report_errors', false); - if(class_exists('RootURLController')) RootURLController::reset(); + if(class_exists('SilverStripe\\CMS\\Controllers\\RootURLController')) RootURLController::reset(); if(class_exists('Translatable')) Translatable::reset(); Versioned::reset(); DataObject::reset(); - if(class_exists('SiteTree')) SiteTree::reset(); + if(class_exists('SilverStripe\\CMS\\Model\\SiteTree')) SiteTree::reset(); Hierarchy::reset(); if(Controller::has_curr()) Controller::curr()->setSession(Injector::inst()->create('Session', array())); Security::$database_is_ready = null; diff --git a/filesystem/AssetControlExtension.php b/filesystem/AssetControlExtension.php index cf8816f02..1aa540f45 100644 --- a/filesystem/AssetControlExtension.php +++ b/filesystem/AssetControlExtension.php @@ -2,10 +2,7 @@ namespace SilverStripe\Filesystem; - use Injector; - - use SilverStripe\Filesystem\Storage\AssetStore; use SilverStripe\Filesystem\Storage\DBFile; use SilverStripe\ORM\DataObject; @@ -13,8 +10,6 @@ use SilverStripe\ORM\Versioning\Versioned; use SilverStripe\ORM\DataExtension; use SilverStripe\Security\Member; - - /** * This class provides the necessary business logic to ensure that any assets attached * to a record are safely deleted, published, or protected during certain operations. diff --git a/forms/TreeDropdownField.php b/forms/TreeDropdownField.php index 7aeef45fe..6c5be8b29 100644 --- a/forms/TreeDropdownField.php +++ b/forms/TreeDropdownField.php @@ -354,7 +354,7 @@ class TreeDropdownField extends FormField { if($nodeThresholdLeaf && !$this->filterCallback && !$this->search) { $className = $this->sourceObject; $nodeCountCallback = function($parent, $numChildren) use($className, $nodeThresholdLeaf) { - if($className == 'SiteTree' && $parent->ID && $numChildren > $nodeThresholdLeaf) { + if($className == 'SilverStripe\\CMS\\Model\\SiteTree' && $parent->ID && $numChildren > $nodeThresholdLeaf) { return sprintf( '
  • %s
', _t('LeftAndMain.TooManyPages', 'Too many pages') diff --git a/forms/htmleditor/HTMLEditorField.php b/forms/htmleditor/HTMLEditorField.php index 566001b44..5e2eb3a26 100644 --- a/forms/htmleditor/HTMLEditorField.php +++ b/forms/htmleditor/HTMLEditorField.php @@ -220,7 +220,7 @@ class HTMLEditorField_Toolbar extends RequestHandler { */ public function LinkForm() { $siteTree = TreeDropdownField::create('internal', _t('HTMLEditorField.PAGE', "Page"), - 'SiteTree', 'ID', 'MenuTitle', true); + 'SilverStripe\\CMS\\Model\\SiteTree', 'ID', 'MenuTitle', true); // mimic the SiteTree::getMenuTitle(), which is bypassed when the search is performed $siteTree->setSearchFunction(array($this, 'siteTreeSearchCallback')); diff --git a/search/FulltextSearchable.php b/search/FulltextSearchable.php index 0d87e6bb2..9c27c8a35 100644 --- a/search/FulltextSearchable.php +++ b/search/FulltextSearchable.php @@ -2,6 +2,8 @@ use SilverStripe\ORM\Connect\MySQLSchemaManager; use SilverStripe\ORM\DataExtension; +use SilverStripe\CMS\Controllers\ContentController; + /** * Provides a simple search engine for your site based on the MySQL FULLTEXT index. * Adds the {@link FulltextSearchable} extension to data classes, @@ -20,13 +22,15 @@ use SilverStripe\ORM\DataExtension; class FulltextSearchable extends DataExtension { /** - * @var String Comma-separated list of database column names - * that can be searched on. Used for generation of the database index defintions. + * Comma-separated list of database column names + * that can be searched on. Used for generation of the database index defintions. + * + * @var string */ protected $searchFields; /** - * @var Array List of class names + * @var array List of class names */ protected static $searchable_classes; @@ -41,12 +45,13 @@ class FulltextSearchable extends DataExtension { * Caution: This is a wrapper method that should only be used in _config.php, * and only be called once in your code. * - * @param Array $searchableClasses The extension will be applied to all DataObject subclasses + * @param array $searchableClasses The extension will be applied to all DataObject subclasses * listed here. Default: {@link SiteTree} and {@link File}. + * @throws Exception */ - public static function enable($searchableClasses = array('SiteTree', 'File')) { + public static function enable($searchableClasses = array('SilverStripe\\CMS\\Model\\SiteTree', 'File')) { $defaultColumns = array( - 'SiteTree' => '"Title","MenuTitle","Content","MetaDescription"', + 'SilverStripe\\CMS\\Model\\SiteTree' => '"Title","MenuTitle","Content","MetaDescription"', 'File' => '"Name","Title"' ); @@ -66,13 +71,13 @@ class FulltextSearchable extends DataExtension { } } self::$searchable_classes = $searchableClasses; - if(class_exists("ContentController")){ - ContentController::add_extension("ContentControllerSearchExtension"); + if(class_exists("SilverStripe\\CMS\\Controllers\\ContentController")){ + ContentController::add_extension("SilverStripe\\CMS\\Search\\ContentControllerSearchExtension"); } } /** - * @param Array|String $searchFields Comma-separated list (or array) of database column names + * @param array|string $searchFields Comma-separated list (or array) of database column names * that can be searched on. Used for generation of the database index defintions. */ public function __construct($searchFields = array()) { @@ -97,7 +102,7 @@ class FulltextSearchable extends DataExtension { /** * Shows all classes that had the {@link FulltextSearchable} extension applied through {@link enable()}. * - * @return Array + * @return array */ public static function get_searchable_classes() { return self::$searchable_classes; diff --git a/tests/control/RequestHandlingTest.php b/tests/control/RequestHandlingTest.php index b7014024e..e3e70baa2 100644 --- a/tests/control/RequestHandlingTest.php +++ b/tests/control/RequestHandlingTest.php @@ -11,9 +11,9 @@ class RequestHandlingTest extends FunctionalTest { protected $illegalExtensions = array( // Suppress CMS error page handling - 'Controller' => array('ErrorPageControllerExtension'), - 'Form' => array('ErrorPageControllerExtension'), - 'LeftAndMain' => array('ErrorPageControllerExtension'), + 'Controller' => array('SilverStripe\\CMS\\Controllers\\ErrorPageControllerExtension'), + 'Form' => array('SilverStripe\\CMS\\Controllers\\ErrorPageControllerExtension'), + 'LeftAndMain' => array('SilverStripe\\CMS\\Controllers\\ErrorPageControllerExtension'), ); public function setUp() { diff --git a/tests/filesystem/FileTest.php b/tests/filesystem/FileTest.php index e0bf801b1..1c7144438 100644 --- a/tests/filesystem/FileTest.php +++ b/tests/filesystem/FileTest.php @@ -6,6 +6,8 @@ use SilverStripe\ORM\Versioning\Versioned; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\ValidationException; use SilverStripe\Security\Member; +use SilverStripe\CMS\Model\ErrorPage; + @@ -50,7 +52,7 @@ class FileTest extends SapphireTest { } // Conditional fixture creation in case the 'cms' module is installed - if(class_exists('ErrorPage')) { + if(class_exists('SilverStripe\\CMS\\Model\\ErrorPage')) { $page = new ErrorPage(array( 'Title' => 'Page not Found', 'ErrorCode' => 404 @@ -90,7 +92,7 @@ class FileTest extends SapphireTest { $this->assertEquals('', $parser->parse('[file_link,id="text"]')); $this->assertEquals('', $parser->parse('[file_link]Example Content[/file_link]')); - if(class_exists('ErrorPage')) { + if(class_exists('SilverStripe\\CMS\\Model\\ErrorPage')) { $errorPage = ErrorPage::get()->filter('ErrorCode', 404)->First(); $this->assertEquals( $errorPage->Link(), diff --git a/view/ViewableData.php b/view/ViewableData.php index 1d6ef1c01..a6bfd3a34 100644 --- a/view/ViewableData.php +++ b/view/ViewableData.php @@ -542,6 +542,9 @@ class ViewableData extends Object implements IteratorAggregate { $classes[] = $this->template; } + // Strip out namespaces + $classes = preg_replace('#.*\\\\#', '', $classes); + return Convert::raw2att(implode(' ', $classes)); }