From d0073a1c4df77d8ee6c62691061a998317a572dc Mon Sep 17 00:00:00 2001 From: Gregory Saumier-Finch Date: Thu, 8 Sep 2022 12:02:47 -0400 Subject: [PATCH] Updates --- asset-manifest.json | 10 +++++----- index.html | 2 +- ...ecache-manifest.6536d8119f4dbd742123e3e7f996e20d.js | 10 +++++----- service-worker.js | 2 +- ...main.8ef19a21.chunk.css => main.dd0b5305.chunk.css} | 4 ++-- ...19a21.chunk.css.map => main.dd0b5305.chunk.css.map} | 2 +- .../{main.92ce8616.chunk.js => main.847225ed.chunk.js} | 4 ++-- static/js/main.847225ed.chunk.js.map | 1 + static/js/main.92ce8616.chunk.js.map | 1 - 9 files changed, 18 insertions(+), 18 deletions(-) rename precache-manifest.680279d2cfc3d149f8b0308a5b1f77d5.js => precache-manifest.6536d8119f4dbd742123e3e7f996e20d.js (82%) rename static/css/{main.8ef19a21.chunk.css => main.dd0b5305.chunk.css} (81%) rename static/css/{main.8ef19a21.chunk.css.map => main.dd0b5305.chunk.css.map} (84%) rename static/js/{main.92ce8616.chunk.js => main.847225ed.chunk.js} (96%) create mode 100644 static/js/main.847225ed.chunk.js.map delete mode 100644 static/js/main.92ce8616.chunk.js.map diff --git a/asset-manifest.json b/asset-manifest.json index 52dd7e1..97573b7 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,18 +1,18 @@ { "files": { - "main.css": "/testbench/static/css/main.8ef19a21.chunk.css", - "main.js": "/testbench/static/js/main.92ce8616.chunk.js", - "main.js.map": "/testbench/static/js/main.92ce8616.chunk.js.map", + "main.css": "/testbench/static/css/main.dd0b5305.chunk.css", + "main.js": "/testbench/static/js/main.847225ed.chunk.js", + "main.js.map": "/testbench/static/js/main.847225ed.chunk.js.map", "runtime~main.js": "/testbench/static/js/runtime~main.09e70599.js", "runtime~main.js.map": "/testbench/static/js/runtime~main.09e70599.js.map", "static/css/2.a1ef10d7.chunk.css": "/testbench/static/css/2.a1ef10d7.chunk.css", "static/js/2.855e931d.chunk.js": "/testbench/static/js/2.855e931d.chunk.js", "static/js/2.855e931d.chunk.js.map": "/testbench/static/js/2.855e931d.chunk.js.map", "index.html": "/testbench/index.html", - "precache-manifest.680279d2cfc3d149f8b0308a5b1f77d5.js": "/testbench/precache-manifest.680279d2cfc3d149f8b0308a5b1f77d5.js", + "precache-manifest.6536d8119f4dbd742123e3e7f996e20d.js": "/testbench/precache-manifest.6536d8119f4dbd742123e3e7f996e20d.js", "service-worker.js": "/testbench/service-worker.js", "static/css/2.a1ef10d7.chunk.css.map": "/testbench/static/css/2.a1ef10d7.chunk.css.map", - "static/css/main.8ef19a21.chunk.css.map": "/testbench/static/css/main.8ef19a21.chunk.css.map", + "static/css/main.dd0b5305.chunk.css.map": "/testbench/static/css/main.dd0b5305.chunk.css.map", "static/media/bootstrap.min.css": "/testbench/static/media/glyphicons-halflings-regular.fa277232.woff" } } \ No newline at end of file diff --git a/index.html b/index.html index 66d7726..dea901e 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Reconciliation service test bench
\ No newline at end of file +Reconciliation service test bench
\ No newline at end of file diff --git a/precache-manifest.680279d2cfc3d149f8b0308a5b1f77d5.js b/precache-manifest.6536d8119f4dbd742123e3e7f996e20d.js similarity index 82% rename from precache-manifest.680279d2cfc3d149f8b0308a5b1f77d5.js rename to precache-manifest.6536d8119f4dbd742123e3e7f996e20d.js index 02c3459..94bf3f2 100644 --- a/precache-manifest.680279d2cfc3d149f8b0308a5b1f77d5.js +++ b/precache-manifest.6536d8119f4dbd742123e3e7f996e20d.js @@ -1,6 +1,6 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ { - "revision": "05b95f340cf1c0b6cebd18148cf1af07", + "revision": "5dc8cfdfc35279a10ce8c64c6487f6fe", "url": "/testbench/index.html" }, { @@ -8,16 +8,16 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "/testbench/static/css/2.a1ef10d7.chunk.css" }, { - "revision": "00a8e7d9cb2fa2bc7d88", - "url": "/testbench/static/css/main.8ef19a21.chunk.css" + "revision": "79fabcc1df12cc789abf", + "url": "/testbench/static/css/main.dd0b5305.chunk.css" }, { "revision": "31fcb2e98539081f2dcc", "url": "/testbench/static/js/2.855e931d.chunk.js" }, { - "revision": "00a8e7d9cb2fa2bc7d88", - "url": "/testbench/static/js/main.92ce8616.chunk.js" + "revision": "79fabcc1df12cc789abf", + "url": "/testbench/static/js/main.847225ed.chunk.js" }, { "revision": "c40a9ccfa148bcc03f62", diff --git a/service-worker.js b/service-worker.js index 9eec1a9..754c3bd 100644 --- a/service-worker.js +++ b/service-worker.js @@ -14,7 +14,7 @@ importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); importScripts( - "/testbench/precache-manifest.680279d2cfc3d149f8b0308a5b1f77d5.js" + "/testbench/precache-manifest.6536d8119f4dbd742123e3e7f996e20d.js" ); self.addEventListener('message', (event) => { diff --git a/static/css/main.8ef19a21.chunk.css b/static/css/main.dd0b5305.chunk.css similarity index 81% rename from static/css/main.8ef19a21.chunk.css rename to static/css/main.dd0b5305.chunk.css index 9e79253..523283f 100644 --- a/static/css/main.8ef19a21.chunk.css +++ b/static/css/main.dd0b5305.chunk.css @@ -1,2 +1,2 @@ -body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.tabContent{margin-top:10px}.featureCell{text-align:center}.featureCell-green{background-color:rgba(0,200,0,.15)}.featureCell-red{background-color:rgba(200,0,0,.15)}.featureCell-yellow{background-color:rgba(210,210,0,.15)}.suggestItemId{float:right;font-size:.8em;padding-left:5px;max-width:50%;overflow:hidden;text-overflow:ellipsis}.suggestItemLabel{max-width:50%;white-space:normal}.suggestItemDescription{color:#888;font-size:.9em;white-space:normal}.dropdown-menu>li>a{text-decoration:none;border-bottom:1px solid #e0e0e0}.dropdown-menu>li:last-child>a{border:none}.dropdown-menu>li>a>li>a{display:inline-block;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dropdown-menu a:hover{text-decoration:none}.reconTypeId{font-size:.9em;color:#888}.active>.list-group-item-text>a{color:#fff}div .radio label{width:100%}.candidateField{font-weight:700}.candidateValue{margin-left:1.5em} -/*# sourceMappingURL=main.8ef19a21.chunk.css.map */ \ No newline at end of file +body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.tabContent{margin-top:10px}.featureCell{text-align:center}.featureCell-green{background-color:rgba(0,200,0,.15)}.featureCell-red{background-color:rgba(200,0,0,.15)}.featureCell-yellow{background-color:rgba(210,210,0,.15)}.suggestItemId{float:right;font-size:.8em;padding-left:5px;max-width:50%;overflow:hidden;text-overflow:ellipsis}.suggestItemLabel{max-width:50%;white-space:normal}.suggestItemDescription{color:#888;font-size:.9em;white-space:normal}.dropdown-menu>li>a{text-decoration:none;border-bottom:1px solid #e0e0e0}.dropdown-menu>li:last-child>a{border:none}.dropdown-menu>li>a>li>a{display:inline-block;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dropdown-menu a:hover{text-decoration:none}.reconTypeId{font-size:.9em;color:#888}.list-group-item.active a{color:#fff}div .radio label{width:100%}.candidateField{font-weight:700}.candidateValue{margin-left:1.5em} +/*# sourceMappingURL=main.dd0b5305.chunk.css.map */ \ No newline at end of file diff --git a/static/css/main.8ef19a21.chunk.css.map b/static/css/main.dd0b5305.chunk.css.map similarity index 84% rename from static/css/main.8ef19a21.chunk.css.map rename to static/css/main.dd0b5305.chunk.css.map index 4940314..aca7e55 100644 --- a/static/css/main.8ef19a21.chunk.css.map +++ b/static/css/main.dd0b5305.chunk.css.map @@ -1 +1 @@ -{"version":3,"sources":["index.css","style.css"],"names":[],"mappings":"AAAA,KACE,QAAS,CACT,mIAEY,CACZ,kCAAmC,CACnC,iCACF,CAEA,KACE,uEAEF,CCXA,YACG,eACH,CAEA,aACG,iBACH,CAEA,mBACG,kCACH,CAEA,iBACG,kCACH,CAEA,oBACG,oCACH,CAIA,eACG,WAAY,CACZ,cAAgB,CAChB,gBAAiB,CACjB,aAAc,CACd,eAAgB,CAChB,sBACH,CAEA,kBACG,aAAc,CACd,kBACH,CAEA,wBACG,UAAW,CACX,cAAgB,CAChB,kBACH,CAEA,oBACG,oBAAqB,CACrB,+BACH,CAEA,+BACG,WACH,CAEA,yBACG,oBAAqB,CACrB,UAAW,CACX,kBAAmB,CACnB,eAAgB,CAChB,sBACH,CAEA,uBACG,oBACH,CAIA,aACG,cAAgB,CAChB,UACH,CAIA,gCACG,UACH,CAEA,iBACI,UACJ,CAEA,gBACI,eACJ,CAEA,gBACI,iBACJ","file":"main.8ef19a21.chunk.css","sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\",\n \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, \"Courier New\",\n monospace;\n}\n","\n.tabContent {\n margin-top: 10px;\n}\n\n.featureCell {\n text-align: center;\n}\n\n.featureCell-green {\n background-color: rgba(0,200,0,.15);\n}\n\n.featureCell-red {\n background-color: rgba(200,0,0,.15);\n}\n\n.featureCell-yellow {\n background-color: rgba(210,210,0,.15);\n}\n\n/* Suggest */\n\n.suggestItemId {\n float: right;\n font-size: 0.8em;\n padding-left: 5px;\n max-width: 50%;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.suggestItemLabel {\n max-width: 50%;\n white-space: normal;\n}\n\n.suggestItemDescription {\n color: #888;\n font-size: 0.9em;\n white-space: normal;\n}\n\n.dropdown-menu > li > a {\n text-decoration: none;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.dropdown-menu > li:last-child > a {\n border: none;\n} \n\n.dropdown-menu > li > a > li > a {\n display: inline-block;\n width: 100%;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis; \n}\n\n.dropdown-menu a:hover {\n text-decoration: none;\n}\n\n/* Types */\n\n.reconTypeId {\n font-size: 0.9em;\n color: #888;\n}\n\n/* Candidates */\n\n.active > .list-group-item-text > a {\n color: white;\n}\n\ndiv .radio label {\n width: 100%;\n}\n\n.candidateField {\n font-weight: bold;\n}\n\n.candidateValue {\n margin-left: 1.5em;\n}\n"]} \ No newline at end of file +{"version":3,"sources":["index.css","style.css"],"names":[],"mappings":"AAAA,KACE,QAAS,CACT,mIAEY,CACZ,kCAAmC,CACnC,iCACF,CAEA,KACE,uEAEF,CCXA,YACG,eACH,CAEA,aACG,iBACH,CAEA,mBACG,kCACH,CAEA,iBACG,kCACH,CAEA,oBACG,oCACH,CAIA,eACG,WAAY,CACZ,cAAgB,CAChB,gBAAiB,CACjB,aAAc,CACd,eAAgB,CAChB,sBACH,CAEA,kBACG,aAAc,CACd,kBACH,CAEA,wBACG,UAAW,CACX,cAAgB,CAChB,kBACH,CAEA,oBACG,oBAAqB,CACrB,+BACH,CAEA,+BACG,WACH,CAEA,yBACG,oBAAqB,CACrB,UAAW,CACX,kBAAmB,CACnB,eAAgB,CAChB,sBACH,CAEA,uBACG,oBACH,CAIA,aACG,cAAgB,CAChB,UACH,CAIA,0BACG,UACH,CAEA,iBACI,UACJ,CAEA,gBACI,eACJ,CAEA,gBACI,iBACJ","file":"main.dd0b5305.chunk.css","sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\",\n \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, \"Courier New\",\n monospace;\n}\n","\n.tabContent {\n margin-top: 10px;\n}\n\n.featureCell {\n text-align: center;\n}\n\n.featureCell-green {\n background-color: rgba(0,200,0,.15);\n}\n\n.featureCell-red {\n background-color: rgba(200,0,0,.15);\n}\n\n.featureCell-yellow {\n background-color: rgba(210,210,0,.15);\n}\n\n/* Suggest */\n\n.suggestItemId {\n float: right;\n font-size: 0.8em;\n padding-left: 5px;\n max-width: 50%;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.suggestItemLabel {\n max-width: 50%;\n white-space: normal;\n}\n\n.suggestItemDescription {\n color: #888;\n font-size: 0.9em;\n white-space: normal;\n}\n\n.dropdown-menu > li > a {\n text-decoration: none;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.dropdown-menu > li:last-child > a {\n border: none;\n} \n\n.dropdown-menu > li > a > li > a {\n display: inline-block;\n width: 100%;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis; \n}\n\n.dropdown-menu a:hover {\n text-decoration: none;\n}\n\n/* Types */\n\n.reconTypeId {\n font-size: 0.9em;\n color: #888;\n}\n\n/* Candidates */\n\n.list-group-item.active a {\n color: white;\n}\n\ndiv .radio label {\n width: 100%;\n}\n\n.candidateField {\n font-weight: bold;\n}\n\n.candidateValue {\n margin-left: 1.5em;\n}\n"]} \ No newline at end of file diff --git a/static/js/main.92ce8616.chunk.js b/static/js/main.847225ed.chunk.js similarity index 96% rename from static/js/main.92ce8616.chunk.js rename to static/js/main.847225ed.chunk.js index 6893715..648bb1a 100644 --- a/static/js/main.92ce8616.chunk.js +++ b/static/js/main.847225ed.chunk.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],{258:function(e,t,i){e.exports=i(638)},263:function(e,t,i){},265:function(e,t,i){},638:function(e,t,i){"use strict";i.r(t);for(var n=i(0),r=i.n(n),a=i(23),s=i.n(a),o=(i(263),i(9)),c=i(10),p=i(12),l=i(11),u=i(13),d=(i(264),i(265),i(251)),h=i.n(d),m=i(69),y=i.n(m),g=i(15),f=i.n(g),v=function(e){function t(){return Object(o.a)(this,t),Object(p.a)(this,Object(l.a)(t).apply(this,arguments))}return Object(u.a)(t,e),Object(c.a)(t,[{key:"render",value:function(){var e="",t="",i="inherit",n="featureCell-default";!0===this.props.value?(e="glyphicon glyphicon-ok",t="available",i="green",n="featureCell-green"):!1===this.props.value?(e="glyphicon glyphicon-remove",t="unavailable",i="#c00000",n="featureCell-red"):"checking"===this.props.value?(e="glyphicon glyphicon-hourglass",t="fetching..."):"maybe"===this.props.value&&(e="glyphicon glyphicon-search",t="Not reachable via CORS, click to check via JSONP",n="featureCell-yellow");var a=r.a.createElement("span",{className:e,"sr-only":t,style:{color:i}}),s=a;return this.props.onClick&&"maybe"===this.props.value&&(s=r.a.createElement(f.a,{onClick:this.props.onClick,bsStyle:"warning",bsSize:"xsmall",title:"Check with JSONP"},a)),r.a.createElement("td",{className:"featureCell "+n},s)}}]),t}(r.a.Component),b=i(60),E=i.n(b),w=function(e,t){var i=new URL(e);return t&&Object.keys(t).forEach(function(e){return i.searchParams.append(e,t[e])}),i.toString()},S=function(e,t){return E()(w(e,t),{timeout:2e4})},j=function(e,t){return fetch(w(e,t))},k={scheme:"monokai",author:"wimer hazenberg (http://www.monokai.nl)",base00:"#000000",base01:"#383830",base02:"#49483e",base03:"#75715e",base04:"#a59f85",base05:"#00ff00",base06:"#f5f4f1",base07:"#f9f8f5",base08:"#f92672",base09:"#fd971f",base0A:"#f4bf75",base0B:"#a6e22e",base0C:"#a1efe4",base0D:"#66d9ef",base0E:"#ae81ff",base0F:"#cc6633"},C=["0.1","latest"],O=i(156),T=i(250),R=new(i.n(T).a)({allErrors:!0}),P={},q=0,x=Object.entries({.1:{"data-extension-query":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/data-extension-query.json",type:"object",description:"This schema validates a data extension query",properties:{ids:{type:"array",description:"The list of entity identifiers to fetch property values from",items:{type:"string"}},properties:{type:"array",description:"The list of properties to fetch, with their optional configuration",items:{type:"object",properties:{id:{type:"string"},settings:{type:"object"}},required:["id"]}}},required:["ids","properties"]},"data-extension-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/data-extension-response.json",type:"object",description:"This schema validates a data extension response",properties:{meta:{type:"array",items:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"object",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]}},required:["id","name"]}},rows:{type:"object",patternProperties:{".*":{type:"object",patternProperties:{".*":{type:"array",items:{oneOf:[{type:"object",additionalProperties:!1},{type:"object",properties:{id:{type:"string"},name:{type:"string"}},required:["id","name"],additionalProperties:!1},{type:"object",properties:{str:{type:"string"}},required:["str"],additionalProperties:!1},{type:"object",properties:{float:{type:"number"}},required:["float"],additionalProperties:!1},{type:"object",properties:{int:{type:"integer"}},required:["int"],additionalProperties:!1},{type:"object",properties:{date:{type:"string",description:"Date and time formatted in ISO format",pattern:"^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\.[0-9]+)?(Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$"}},required:["date"],additionalProperties:!1}]}}}}}}},required:["rows","meta"]},manifest:{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/manifest.json",type:"object",description:"This validates a service manifest, describing the features supported by the endpoint.",properties:{name:{type:"string",description:"A human-readable name for the service or data source"},identifierSpace:{type:"string",description:"A URI describing the entity identifiers used in this service"},schemaSpace:{type:"string",description:"A URI describing the schema used in this service"},view:{type:"object",properties:{url:{type:"string",description:"A template to transform an entity identifier into the corresponding URI",pattern:".*\\{\\{id\\}\\}.*"}},required:["url"]},defaultTypes:{type:"array",description:"A list of default types that are considered good generic choices for reconciliation",items:{type:"object",properties:{id:{type:"string"},name:{type:"string"}},required:["id","name"]},uniqueItems:!0},suggest:{type:"object",description:"Settings for the suggest protocol, to auto-complete entities, properties and types",definitions:{service_definition:{type:"object",properties:{service_url:{type:"string"},service_path:{type:"string"},flyout_service_url:{type:"string"},flyout_service_path:{type:"string",pattern:".*\\$\\{id\\}.*"}},required:[]}},properties:{entity:{$ref:"#/properties/suggest/definitions/service_definition"},property:{$ref:"#/properties/suggest/definitions/service_definition"},type:{$ref:"#/properties/suggest/definitions/service_definition"}}},preview:{type:"object",description:"Settings for the preview protocol, for HTML previews of entities",properties:{url:{type:"string",pattern:".*\\{\\{id\\}\\}.*",description:"A URL pattern which transforms the entity ID into a preview URL for it"},width:{type:"integer",description:"The width of the iframe where to include the HTML preview"},height:{type:"integer",description:"The height of the iframe where to include the HTML preview"}},required:["url","width","height"]},extend:{type:"object",description:"Settings for the data extension protocol, to fetch property values",properties:{propose_properties:{type:"object",description:"Location of the endpoint to propose properties to fetch for a given type",properties:{service_url:{type:"string"},service_path:{type:"string"}}},property_settings:{type:"array",description:"Definition of the settings configurable by the user when fetching a property",items:{oneOf:[{type:"object",description:"Defines a numerical setting on a property",properties:{type:{type:"string",enum:["number"]},default:{type:"number"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"}},required:["type","label","name"]},{type:"object",description:"Defines a string setting on a property",properties:{type:{type:"string",enum:["text"]},default:{type:"string"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"}},required:["type","label","name"]},{type:"object",description:"Defines a boolean setting on a property",properties:{type:{type:"string",enum:["checkbox"]},default:{type:"boolean"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"}},required:["type","label","name"]},{type:"object",description:"Defines a setting with a fixed set of choices",properties:{type:{type:"string",enum:["select"]},default:{type:"string"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"},choices:{type:"array",items:{type:"object",properties:{value:{type:"string"},name:{type:"string"}},required:["value","name"]}}},required:["type","label","name","choices"]}]}}}}},required:["name","identifierSpace","schemaSpace"]},"reconciliation-query-batch":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/reconciliation-query.json",type:"object",description:"This schema validates the JSON serialization of any reconciliation query batch, i.e. the payload of a GET/POST to a reconciliation endpoint.",definitions:{property_value:{oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"object",description:"A property value which represents another entity, for instance if it was previously reconciled itself",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]}]}},patternProperties:{"^.*$":{type:"object",properties:{query:{type:"string",description:"A string to be matched against the name of the entities"},type:{description:"Either a single type identifier or a list of type identifiers",oneOf:[{type:"string"},{type:"array",items:{type:"string"}}]},limit:{type:"number",description:"The maximum number of candidates to return"},properties:{type:"array",description:"An optional list of property mappings to refine the query",items:{type:"object",properties:{pid:{type:"string",description:"The identifier of the property, whose values will be compared to the values supplied"},v:{description:"A value (or array of values) to match against the property values associated with the property on each candidate",oneOf:[{$ref:"#/definitions/property_value"},{type:"array",items:{$ref:"#/definitions/property_value"}}]}},required:["pid","v"]}},type_strict:{type:"string",description:"A classification of the type matching strategy when multiple types are supplied",enum:["any","should","all"]}},required:["query"],additionalProperties:!1}}},"reconciliation-result-batch":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/reconciliation-result-batch.json",type:"object",description:"This schema can be used to validate the JSON\xa0serialization of any reconciliation result batch.",patternProperties:{"^.*$":{type:"object",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Entity identifier of the candidate"},name:{type:"string",description:"Entity name of the candidate"},score:{type:"number",description:"Number indicating how likely it is that the candidate matches the query"},match:{type:"boolean",description:"Boolean value indicating whether the candiate is a certain match or not."},type:{type:"array",description:"Types the candidate entity belongs to",items:{oneOf:[{type:"object",description:"A type can be given by id and name",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]},{type:"string",description:"Alternatively, if only a string is given, it is treated as the id"}]}}},required:["id","name","score"]}}},required:["result"]}}},"suggest-entities-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/suggest-entities-response.json",type:"object",description:"This schema can be used to validate the JSON response of a suggest service for entities.",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Identifier of the suggested entity"},name:{type:"string",description:"Name of the suggested entity"},description:{type:"string",description:"An optional description which can be provided to disambiguate namesakes, providing more context."},notable:{type:"array",description:"Types the suggest entity belongs to",items:{oneOf:[{type:"object",description:"A type can be given by id and name",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]},{type:"string",description:"Alternatively, if only a string is given, it is treated as the id"}]}}},required:["id","name"]}}},required:["result"]},"suggest-properties-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/suggest-properties-response.json",type:"object",description:"This schema can be used to validate the JSON response of a suggest service for properties.",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Identifier of the suggested property"},name:{type:"string",description:"Name of the suggested property"},description:{type:"string",description:"An optional description which can be provided to disambiguate namesakes, providing more context."}},required:["id","name"]}}},required:["result"]},"suggest-types-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/suggest-types-response.json",type:"object",description:"This schema can be used to validate the JSON response of a suggest service for types.",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Identifier of the suggested type"},name:{type:"string",description:"Name of the suggested type"},description:{type:"string",description:"An optional description which can be provided to disambiguate namesakes, providing more context."}},required:["id","name"]}}},required:["result"]}},latest:{"data-extension-query":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/data-extension-query.json",type:"object",description:"This schema validates a data extension query",properties:{ids:{type:"array",description:"The list of entity identifiers to fetch property values from",items:{type:"string"}},properties:{type:"array",description:"The list of properties to fetch, with their optional configuration",items:{type:"object",properties:{id:{type:"string"},settings:{type:"object"}},required:["id"]}}},required:["ids","properties"]},"data-extension-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/data-extension-response.json",type:"object",description:"This schema validates a data extension response",properties:{meta:{type:"array",items:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"object",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]}},required:["id","name"]}},rows:{type:"object",patternProperties:{".*":{type:"object",patternProperties:{".*":{type:"array",items:{oneOf:[{type:"object",additionalProperties:!1},{type:"object",properties:{id:{type:"string"},name:{type:"string"},description:{type:"string"}},required:["id","name"],additionalProperties:!1},{type:"object",properties:{str:{type:"string"}},required:["str"],additionalProperties:!1},{type:"object",properties:{float:{type:"number"}},required:["float"],additionalProperties:!1},{type:"object",properties:{int:{type:"integer"}},required:["int"],additionalProperties:!1},{type:"object",properties:{date:{type:"string",description:"Date and time formatted in ISO format",pattern:"^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\.[0-9]+)?(Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$"}},required:["date"],additionalProperties:!1}]}}}}}}},required:["rows","meta"]},manifest:{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/manifest.json",type:"object",description:"This validates a service manifest, describing the features supported by the endpoint.",properties:{versions:{type:"array",description:"The list of API versions supported by this service.",items:{type:"string"},contains:{enum:["0.2"]}},name:{type:"string",description:"A human-readable name for the service or data source"},identifierSpace:{type:"string",description:"A URI describing the entity identifiers used in this service"},schemaSpace:{type:"string",description:"A URI describing the schema used in this service"},view:{type:"object",properties:{url:{type:"string",description:"A template to transform an entity identifier into the corresponding URI",pattern:".*\\{\\{id\\}\\}.*"}},required:["url"]},feature_view:{type:"object",properties:{url:{type:"string",description:"A template to transform a matching feature identifier into the corresponding URI",pattern:".*\\{\\{id\\}\\}.*"}},required:["url"]},defaultTypes:{type:"array",description:"A list of default types that are considered good generic choices for reconciliation",items:{type:"object",properties:{id:{type:"string"},name:{type:"string"}},required:["id","name"]},uniqueItems:!0},suggest:{type:"object",description:"Settings for the suggest protocol, to auto-complete entities, properties and types",definitions:{service_definition:{type:"object",properties:{service_url:{type:"string"},service_path:{type:"string"},flyout_service_url:{type:"string"},flyout_service_path:{type:"string",pattern:".*\\$\\{id\\}.*"}},required:[]}},properties:{entity:{$ref:"#/properties/suggest/definitions/service_definition"},property:{$ref:"#/properties/suggest/definitions/service_definition"},type:{$ref:"#/properties/suggest/definitions/service_definition"}}},preview:{type:"object",description:"Settings for the preview protocol, for HTML previews of entities",properties:{url:{type:"string",pattern:".*\\{\\{id\\}\\}.*",description:"A URL pattern which transforms the entity ID into a preview URL for it"},width:{type:"integer",description:"The width of the iframe where to include the HTML preview"},height:{type:"integer",description:"The height of the iframe where to include the HTML preview"}},required:["url","width","height"]},extend:{type:"object",description:"Settings for the data extension protocol, to fetch property values",properties:{propose_properties:{type:"object",description:"Location of the endpoint to propose properties to fetch for a given type",properties:{service_url:{type:"string"},service_path:{type:"string"}}},property_settings:{type:"array",description:"Definition of the settings configurable by the user when fetching a property",items:{oneOf:[{type:"object",description:"Defines a numerical setting on a property",properties:{type:{type:"string",enum:["number"]},default:{type:"number"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"}},required:["type","label","name"]},{type:"object",description:"Defines a string setting on a property",properties:{type:{type:"string",enum:["text"]},default:{type:"string"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"}},required:["type","label","name"]},{type:"object",description:"Defines a boolean setting on a property",properties:{type:{type:"string",enum:["checkbox"]},default:{type:"boolean"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"}},required:["type","label","name"]},{type:"object",description:"Defines a setting with a fixed set of choices",properties:{type:{type:"string",enum:["select"]},default:{type:"string"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"},choices:{type:"array",items:{type:"object",properties:{value:{type:"string"},name:{type:"string"}},required:["value","name"]}}},required:["type","label","name","choices"]}]}}}},serverLimits:{type:"object",description:"Resource constraints imposed by the service on clients",properties:{batchRate:{type:"integer",description:"The number of reconciliation query batch requests which can safely be sent to this service per second per IP address."},maxConnections:{type:"integer",description:"The number of TCP connections which can be concurrently kept open from a single IP address."}}}},required:["versions","name","identifierSpace","schemaSpace"]},"reconciliation-query-batch":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/reconciliation-query.json",type:"object",description:"This schema validates the JSON serialization of any reconciliation query batch, i.e. the payload of a GET/POST to a reconciliation endpoint.",definitions:{property_value:{oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"object",description:"A property value which represents another entity, for instance if it was previously reconciled itself",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]}]}},patternProperties:{"^.*$":{type:"object",properties:{query:{type:"string",description:"A string to be matched against the name of the entities"},type:{description:"Either a single type identifier or a list of type identifiers",oneOf:[{type:"string"},{type:"array",items:{type:"string"}}]},limit:{type:"number",description:"The maximum number of candidates to return"},properties:{type:"array",description:"An optional list of property mappings to refine the query",items:{type:"object",properties:{pid:{type:"string",description:"The identifier of the property, whose values will be compared to the values supplied"},v:{description:"A value (or array of values) to match against the property values associated with the property on each candidate",oneOf:[{$ref:"#/definitions/property_value"},{type:"array",items:{$ref:"#/definitions/property_value"}}]}},required:["pid","v"]}},type_strict:{type:"string",description:"A classification of the type matching strategy when multiple types are supplied",enum:["any","should","all"]}},required:["query"],additionalProperties:!1}}},"reconciliation-result-batch":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/reconciliation-result-batch.json",type:"object",description:"This schema can be used to validate the JSON\xa0serialization of any reconciliation result batch.",patternProperties:{"^.*$":{type:"object",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Entity identifier of the candidate"},name:{type:"string",description:"Entity name of the candidate"},description:{type:"string",description:"Optional description of the candidate entity"},score:{type:"number",description:"Number indicating how likely it is that the candidate matches the query"},features:{type:"array",description:"A list of features which can be used to derive a matching score",items:{type:"object",properties:{id:{type:"string",description:"A unique string identifier for the feature"},value:{description:"The value of the feature for this reconciliation candidate",oneOf:[{type:"boolean"},{type:"number"}]}}}},match:{type:"boolean",description:"Boolean value indicating whether the candiate is a certain match or not."},type:{type:"array",description:"Types the candidate entity belongs to",items:{oneOf:[{type:"object",description:"A type can be given by id and name",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]},{type:"string",description:"Alternatively, if only a string is given, it is treated as the id"}]}}},required:["id","name","score"]}}},required:["result"]}}},"suggest-entities-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/suggest-entities-response.json",type:"object",description:"This schema can be used to validate the JSON response of a suggest service for entities.",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Identifier of the suggested entity"},name:{type:"string",description:"Name of the suggested entity"},description:{type:"string",description:"An optional description which can be provided to disambiguate namesakes, providing more context."},notable:{type:"array",description:"Types the suggest entity belongs to",items:{oneOf:[{type:"object",description:"A type can be given by id and name",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]},{type:"string",description:"Alternatively, if only a string is given, it is treated as the id"}]}}},required:["id","name"]}}},required:["result"]},"suggest-properties-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/suggest-properties-response.json",type:"object",description:"This schema can be used to validate the JSON response of a suggest service for properties.",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Identifier of the suggested property"},name:{type:"string",description:"Name of the suggested property"},description:{type:"string",description:"An optional description which can be provided to disambiguate namesakes, providing more context."}},required:["id","name"]}}},required:["result"]},"suggest-types-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/suggest-types-response.json",type:"object",description:"This schema can be used to validate the JSON response of a suggest service for types.",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Identifier of the suggested type"},name:{type:"string",description:"Name of the suggested type"},description:{type:"string",description:"An optional description which can be provided to disambiguate namesakes, providing more context."}},required:["id","name"]}}},required:["result"]}}});q "),r.a.createElement("span",{className:"suggestItemLabel"},e.name),r.a.createElement("br",null),r.a.createElement("span",{className:"suggestItemDescription"},e.description))}})}},{key:"manifest",get:function(){return this.props.service?this.props.service.manifest:null}}]),t}(r.a.Component),ke=function(e){function t(){var e;return Object(o.a)(this,t),(e=Object(p.a)(this,Object(l.a)(t).call(this))).onSuggestChange=function(t){e.setState({value:t}),void 0!==e.props.onChange&&e.props.onChange(t)},e.onIdChange=function(t){var i={id:t.currentTarget.value,name:t.currentTarget.value};void 0===e.props.onChange?e.setState({value:i}):void 0===e.props.explicitSubmit?e.props.onChange(i):e.setState({value:i})},e.onSubmit=function(t){e.props.onChange(e.state.value),t.preventDefault()},e.state={value:void 0},e}return Object(u.a)(t,e),Object(c.a)(t,[{key:"getValue",value:function(){return void 0!==this.props.onChange?this.props.value:this.state.value}},{key:"render",value:function(){return this.hasAutocomplete?r.a.createElement(je,{service:this.props.service,entityClass:this.props.entityClass,onChange:this.onSuggestChange,value:this.currentValue}):void 0!==this.props.explicitSubmit?r.a.createElement(fe.a,null,r.a.createElement(ie.a,{type:"text",placeholder:this.placeholder,value:this.currentId||"",onChange:this.onIdChange}),r.a.createElement(fe.a.Button,null,r.a.createElement(f.a,{onClick:this.onSubmit,type:"submit",bsStyle:"primary"},"Submit"))):r.a.createElement(ie.a,{type:"text",placeholder:this.placeholder,value:this.currentId||"",onChange:this.onIdChange})}},{key:"manifest",get:function(){return this.props.service?this.props.service.manifest:null}},{key:"placeholder",get:function(){return this.props.entityClass+" id"}},{key:"currentValue",get:function(){return void 0===this.props.onChange?this.state.value:this.props.value||this.state.value}},{key:"currentId",get:function(){var e=this.currentValue;return void 0===e?void 0:e.id}},{key:"hasAutocomplete",get:function(){return this.manifest&&this.manifest.suggest&&this.manifest.suggest[this.props.entityClass]}}]),t}(r.a.Component),Ce=function(e){function t(){var e,i;Object(o.a)(this,t);for(var n=arguments.length,r=new Array(n),a=0;a0&&", ",e.name+" ("+e.id+")"]})))}},{key:"renderFeatures",value:function(){var e=this.props.candidate.features;if(void 0!==e)return r.a.createElement("div",null,e.map(function(e,t){return r.a.createElement("div",{key:t},r.a.createElement("div",{className:"candidateField"},"Feature ",e.id),r.a.createElement("div",{className:"candidateValue"},e.value))}))}},{key:"render",value:function(){var e=this.props.candidate;return r.a.createElement(Pe.a,{key:e.id,header:e.name,active:e.match},r.a.createElement(Te.a,{style:{float:"right"}},this.props.candidate.score),r.a.createElement("div",null,r.a.createElement("div",null,r.a.createElement("div",{className:"candidateField"},"ID"),r.a.createElement("div",{className:"candidateValue"},r.a.createElement("a",{href:this.url},e.id))),this.renderDescription(),this.renderTypes(),this.renderFeatures()))}},{key:"url",get:function(){var e=null;return"view"in this.props.manifest&&"url"in this.props.manifest.view&&"id"in this.props.candidate&&(e=this.props.manifest.view.url.replace("{{id}}",this.props.candidate.id)),e}}]),t}(r.a.Component),xe=function(e){function t(){var e,i;Object(o.a)(this,t);for(var n=arguments.length,r=new Array(n),a=0;aThe manifest must provide the width and height of the preview iframe as integers.

"};try{return new URL(e),{__html:'')}}catch(t){return{__html:"

Invalid URL generated by the preview service URL template.

"}}},i}return Object(u.a)(t,e),Object(c.a)(t,[{key:"render",value:function(){return r.a.createElement("div",null,void 0===this.props.id?r.a.createElement("div",null):r.a.createElement("div",{dangerouslySetInnerHTML:this.iframe()}))}}]),t}(r.a.Component),Ne=function(e){function t(){return Object(o.a)(this,t),Object(p.a)(this,Object(l.a)(t).apply(this,arguments))}return Object(u.a)(t,e),Object(c.a)(t,[{key:"render",value:function(){return r.a.createElement(Pe.a,{key:this.props.key,header:this.renderedValue},this.datatype)}},{key:"renderedValue",get:function(){var e=this.props.value;return void 0!==e.date?e.date:void 0!==e.id&&void 0!==e.name?e.name:void 0!==e.str?e.str:void 0!==e.float?e.float:void 0!==e.int?e.int:"Singleton"}},{key:"datatype",get:function(){var e=this.props.value;return void 0!==e.date?"date":void 0!==e.id&&void 0!==e.name?e.id:void 0!==e.str?"string":void 0!==e.float?"floating-point number":void 0!==e.int?"integer":"empty"}}]),t}(r.a.Component),_e=i(97),Ie=i.n(_e),Ae=function(e){function t(){var e;return Object(o.a)(this,t),(e=Object(p.a)(this,Object(l.a)(t).call(this))).onEntityChange=function(t){e.setState({entity:t,extendResults:void 0,validationErrors:[]})},e.onPropertyChange=function(t){e.setState({property:t,extendResults:void 0,validationErrors:[]})},e.resetQuery=function(t){t.preventDefault(),e.setState({entity:void 0,property:void 0,extendResults:void 0,validationErrors:void 0})},e.submitQuery=function(t){t.preventDefault(),e.setState({extendResults:"fetching"}),e.props.service.getFetcher()(e.formulateQueryUrl(),{timeout:2e4}).then(function(e){return e.json()}).then(function(t){return e.setState({extendResults:t,validationErrors:e.validateServiceResponse(t)})}).catch(function(t){e.setState({exdentResults:"failed",extendError:t.message})})},e.state={entity:void 0,property:void 0,extendResults:void 0,validationErrors:[]},e}return Object(u.a)(t,e),Object(c.a)(t,[{key:"formulateQuery",value:function(){return void 0!==this.state.entity&&void 0!==this.state.property?{ids:[this.state.entity.id],properties:[{id:this.state.property.id}]}:{}}},{key:"formulateQueryUrl",value:function(){var e=this.props.service.endpoint;if(!e)return"#";var t={extend:JSON.stringify(this.formulateQuery())},i=new URL(e);return Object.keys(t).forEach(function(e){return i.searchParams.append(e,t[e])}),i.toString()}},{key:"renderResponseValidationErrors",value:function(){return r.a.createElement("div",null)}},{key:"renderQueryResults",value:function(){if("fetching"===this.state.extendResults)return r.a.createElement("div",{className:"resultsPlaceholder"},"Querying the service...");if("failed"===this.state.extendResults)return r.a.createElement("div",{className:"resultsPlaceholder"},"Error: ",this.state.extendError);if(void 0===this.state.extendResults||void 0===this.state.entity||void 0===this.state.property)return r.a.createElement("div",null);if(void 0===this.state.extendResults.rows)return r.a.createElement("span",{className:"resultsPlaceholder"},"No ",r.a.createElement("code",null,"rows")," attribute in the response.");if(void 0===this.state.extendResults.rows[this.state.entity.id])return r.a.createElement("span",{className:"resultsPlaceholder"},"Missing ",r.a.createElement("code",null,"rows.",this.state.entity.id)," object in the response.");if(void 0===this.state.extendResults.rows[this.state.entity.id][this.state.property.id])return r.a.createElement("span",{className:"resultsPlaceholder"},"Missing ",r.a.createElement("code",null,"rows.",this.state.entity.id,this.state.property.id)," object in the response.");var e=this.state.extendResults.rows[this.state.entity.id][this.state.property.id];return 0===e.length?r.a.createElement("span",{className:"noResults"},"No results"):r.a.createElement(we.a,null,e.map(function(e,t){return r.a.createElement(Ne,{value:e,key:"data-extension-result-"+t})}))}},{key:"validateServiceResponse",value:function(e){var t=Q(this.props.service.latestCompatibleVersion,"data-extension-response");return t(e)?[]:t.errors.map(function(e){return e.dataPath+" "+e.message})}},{key:"render",value:function(){return r.a.createElement("div",null,r.a.createElement(ce.a,{sm:5},r.a.createElement(Z.a,{horizontal:!0},r.a.createElement(ee.a,{controlId:"dataExtensionEntity"},r.a.createElement(ce.a,{componentClass:re.a,sm:2},"Entity:"),r.a.createElement(ce.a,{sm:10},r.a.createElement(ke,{service:this.props.service,placeholder:"Entity to fetch data from",value:this.state.entity,entityClass:"entity",onChange:this.onEntityChange}))),r.a.createElement(ee.a,{controlId:"dataExtensionProperty"},r.a.createElement(ce.a,{componentClass:re.a,sm:2},"Property:"),r.a.createElement(ce.a,{sm:10},r.a.createElement(ke,{service:this.props.service,placeholder:"Property to fetch on the entity",value:this.state.property,entityClass:"property",onChange:this.onPropertyChange}))),r.a.createElement(ee.a,{controlId:"submitGroup"},r.a.createElement(ce.a,{sm:10}),r.a.createElement(ce.a,{sm:2},r.a.createElement(fe.a,null,r.a.createElement(fe.a.Button,null,r.a.createElement(f.a,{onClick:this.resetQuery,type:"submit",bsStyle:"default"},"Reset")),r.a.createElement(fe.a.Button,null,r.a.createElement(f.a,{onClick:this.submitQuery,type:"submit",bsStyle:"primary"},"Submit"))))))),r.a.createElement(ce.a,{sm:3},r.a.createElement(Ie.a,{theme:k,data:this.formulateQuery(),getItemString:function(e,t,i,n){return""},shouldExpandNode:function(e,t,i){return!0},hideRoot:!0}),r.a.createElement("br",null),r.a.createElement("a",{href:this.formulateQueryUrl(),title:"See query results on the service",target:"_blank",rel:"noopener noreferrer"},"View query results on the service"),this.renderResponseValidationErrors()),r.a.createElement(ce.a,{sm:4},this.renderQueryResults()))}}]),t}(r.a.Component),Le=function(e){function t(){var e;return Object(o.a)(this,t),(e=Object(p.a)(this,Object(l.a)(t).call(this))).onReconQueryChange=function(t){e.setState({reconQuery:t.currentTarget.value})},e.onReconTypeChange=function(t){e.setState({reconType:t.currentTarget.value})},e.onCustomTypeChange=function(t){e.setState({reconCustomType:t})},e.onReconPropertiesChange=function(t){e.setState({reconProperties:t})},e.onReconLimitChange=function(t){e.setState({reconLimit:t.currentTarget.value})},e.onPreviewEntityChange=function(t){e.setState({previewEntityId:void 0!==t?t.id:void 0})},e.onSubmitReconciliation=function(t){(t.preventDefault(),e.props.service&&e.props.service.endpoint)&&(e.setState({reconResults:"fetching"}),e.props.service.getFetcher()(e.formulateQueryUrl(),{timeout:2e4}).then(function(e){return e.json()}).then(function(t){return e.setState({reconResults:t.q0.result,reconResponseValidationErrors:e.validateServiceResponse("reconciliation-result-batch",t)})}).catch(function(t){e.setState({reconError:t.message,reconResults:"failed"})}))},e.state={reconQuery:"",reconType:"no-type",reconCustomType:void 0,reconProperties:[],reconLimit:void 0,reconResponseValidationErrors:[],previewEntityId:void 0},e}return Object(u.a)(t,e),Object(c.a)(t,[{key:"validateServiceResponse",value:function(e,t){var i=Q(this.props.service.latestCompatibleVersion,e);return i(t)?[]:i.errors.map(function(e){return e.dataPath+" "+e.message})}},{key:"renderQueryResults",value:function(){var e=this;return"fetching"===this.state.reconResults?r.a.createElement("div",{className:"resultsPlaceholder"},"Querying the service..."):"failed"===this.state.reconResults?r.a.createElement("div",{className:"resultsPlaceholder"},"Error: ",this.state.reconError):void 0===this.state.reconResults?r.a.createElement("div",null):0===this.state.reconResults.length?r.a.createElement("span",{className:"noResults"},"No results"):r.a.createElement(we.a,null,this.state.reconResults.map(function(t){return r.a.createElement(qe,{candidate:t,manifest:e.props.service.manifest})}))}},{key:"renderReconResponseValidationErrors",value:function(){return 0===this.state.reconResponseValidationErrors.length?r.a.createElement("div",null):r.a.createElement(ue.a,{bsStyle:"warning"},r.a.createElement("strong",null,"Validations error for reconcilation response"),r.a.createElement("ul",null,this.state.reconResponseValidationErrors.map(function(e,t){return r.a.createElement("li",{key:t},e)})))}},{key:"renderManifestValidationErrors",value:function(){var e=this.props.service.manifest,t=this.validateServiceResponse("manifest",e);return 0===t.length?r.a.createElement("div",null):r.a.createElement(ue.a,{bsStyle:"warning"},r.a.createElement("strong",null,"Validation errors for service manifest"),r.a.createElement("ul",null,t.map(function(e,t){return r.a.createElement("li",{key:t},e)})))}},{key:"formulateReconQuery",value:function(){var e={query:this.state.reconQuery};return"custom-type"===this.state.reconType&&void 0!==this.state.reconCustomType?e.type=this.state.reconCustomType.id:"no-type"!==this.state.reconType&&(e.type=this.state.reconType),this.state.reconProperties.length>0&&(e.properties=this.state.reconProperties.filter(function(e){return void 0!==e&&e.property&&e.value}).map(function(e){return{pid:e.property.id,v:e.value}})),isNaN(parseInt(this.state.reconLimit))||(e.limit=parseInt(this.state.reconLimit)),e}},{key:"formulateQueryUrl",value:function(){var e=this.props.service.endpoint;if(!e)return"#";var t={queries:JSON.stringify({q0:this.formulateReconQuery()})},i=new URL(e);return Object.keys(t).forEach(function(e){return i.searchParams.append(e,t[e])}),i.toString()}},{key:"renderTypeChoices",value:function(){var e=this,t=this.state.reconType,i=this.defaultTypes.map(function(i){return r.a.createElement(be.a,{name:"reconcileType",key:"key_"+i.id,value:i.id,checked:t===i.id,onChange:e.onReconTypeChange},i.name,r.a.createElement("br",null),Array.isArray(i.broader)&&i.broader.length&&r.a.createElement("span",{className:"reconTypeId"},i.broader.map(function(e){return e.id}).join(", ")," > "),r.a.createElement("span",{className:"reconTypeId"},i.id))});return this.hasTypeSuggest&&i.push(r.a.createElement(be.a,{name:"reconcileType",key:"custom-type",value:"custom-type",checked:"custom-type"===t,onChange:this.onReconTypeChange},"Custom:",r.a.createElement("div",null,r.a.createElement(je,{service:this.props.service,entityClass:"type",id:"recon-custom-type-suggest",value:this.state.reconCustomType,onChange:this.onCustomTypeChange})))),i.push(r.a.createElement(be.a,{name:"reconcileType",key:"no-type",value:"no-type",checked:"no-type"===t,onChange:this.onReconTypeChange},"Reconcile against no particular type")),i}},{key:"render",value:function(){var e=this;return r.a.createElement("div",null,this.renderManifestValidationErrors(),r.a.createElement(he.a,{defaultActiveKey:"reconcile",animation:!1,id:"test-bench-tabs"},r.a.createElement(ye.a,{eventKey:"reconcile",title:"Reconcile"},r.a.createElement("div",{className:"tabContent"},r.a.createElement(ce.a,{sm:5},r.a.createElement(Z.a,{horizontal:!0},r.a.createElement(ee.a,{controlId:"reconcileName"},r.a.createElement(ce.a,{componentClass:re.a,sm:2},"Name:"),r.a.createElement(ce.a,{sm:10},r.a.createElement(fe.a,null,r.a.createElement(ie.a,{type:"text",placeholder:"Entity to reconcile",value:this.state.reconQuery,onChange:this.onReconQueryChange}),r.a.createElement(fe.a.Button,null,r.a.createElement(f.a,{onClick:this.onSubmitReconciliation,type:"submit",bsStyle:"primary",disabled:!this.props.service},"Reconcile"))))),r.a.createElement(ee.a,{controlId:"reconcileType"},r.a.createElement(ce.a,{componentClass:re.a,sm:2},"Type:"),r.a.createElement(ce.a,{sm:10},this.renderTypeChoices())),r.a.createElement(ee.a,{controlId:"reconcileProperties"},r.a.createElement(ce.a,{componentClass:re.a,sm:2},"Properties:"),r.a.createElement(ce.a,{sm:10},r.a.createElement(Ce,{service:this.props.service,value:this.state.reconProperties,onChange:this.onReconPropertiesChange}))),r.a.createElement(ee.a,{controlId:"reconcileLimit"},r.a.createElement(ce.a,{componentClass:re.a,sm:2},"Limit:"),r.a.createElement(ce.a,{sm:10},r.a.createElement(ie.a,{type:"number",placeholder:"Maximum number of candidates",value:this.state.reconLimit,onChange:function(t){return e.onReconLimitChange(t)}}))))),r.a.createElement(ce.a,{sm:3},r.a.createElement(Ie.a,{theme:k,data:this.formulateReconQuery(),getItemString:function(e,t,i,n){return""},shouldExpandNode:function(e,t,i){return!0},hideRoot:!0}),r.a.createElement("br",null),r.a.createElement("a",{href:this.formulateQueryUrl(),title:"See query results on the service",target:"_blank",rel:"noopener noreferrer"},"View query results on the service"),this.renderReconResponseValidationErrors()),r.a.createElement(ce.a,{sm:4},this.renderQueryResults()))),r.a.createElement(ye.a,{eventKey:"suggest",title:"Suggest"},r.a.createElement("div",{className:"tabContent"},r.a.createElement(Z.a,{horizontal:!0},r.a.createElement(ee.a,{controlId:"suggestEntityTestBench"},r.a.createElement(ce.a,{componentClass:re.a,sm:1},"Entity:"),r.a.createElement(ce.a,{sm:11},r.a.createElement(je,{service:this.props.service,entityClass:"entity",id:"entity-suggest-test"}))),r.a.createElement(ee.a,{controlId:"suggestTypeTestBench"},r.a.createElement(ce.a,{componentClass:re.a,sm:1},"Type:"),r.a.createElement(ce.a,{sm:11},r.a.createElement(je,{service:this.props.service,entityClass:"type",id:"type-suggest-test"}))),r.a.createElement(ee.a,{controlId:"suggestPropertyTestBench"},r.a.createElement(ce.a,{componentClass:re.a,sm:1},"Property:"),r.a.createElement(ce.a,{sm:11},r.a.createElement(je,{service:this.props.service,entityClass:"property",id:"property-suggest-test"})))))),r.a.createElement(ye.a,{eventKey:"preview",title:"Preview",disabled:!this.hasPreviewService},r.a.createElement("div",{className:"tabContent"},this.hasPreviewService?r.a.createElement("div",null,r.a.createElement(Z.a,{horizontal:!0},r.a.createElement(ee.a,{controlId:"suggestEntityTestBench"},r.a.createElement(ce.a,{componentClass:re.a,sm:1},"Entity:"),r.a.createElement(ce.a,{sm:11},r.a.createElement(ke,{service:this.props.service,entityClass:"entity",id:"entity-input-preview",explicitSubmit:!0,onChange:this.onPreviewEntityChange})))),r.a.createElement(xe,{id:this.state.previewEntityId,settings:this.props.service.manifest.preview})):r.a.createElement("p",null,"Previewing is not supported by the service."))),r.a.createElement(ye.a,{eventKey:"extend",title:"Extend",disabled:!this.hasDataExtension},r.a.createElement("div",{className:"tabContent"},this.hasDataExtension?r.a.createElement(Ae,{service:this.props.service}):r.a.createElement("p",null,"Data extension is not supported by the service.")))))}},{key:"defaultTypes",get:function(){return this.props.service&&this.props.service.manifest&&this.props.service.manifest.defaultTypes||[]}},{key:"hasTypeSuggest",get:function(){return this.props.service&&this.props.service.manifest&&this.props.service.manifest.suggest&&this.props.service.manifest.suggest.type}},{key:"hasPropertySuggest",get:function(){return this.props.service&&this.props.service.manifest&&this.props.service.manifest.suggest&&this.props.service.manifest.suggest.property}},{key:"hasPreviewService",get:function(){return this.props.service&&this.props.service.manifest&&this.props.service.manifest.preview}},{key:"hasDataExtension",get:function(){return this.props.service&&this.props.service.manifest&&this.props.service.manifest.extend}}]),t}(r.a.Component);function $e(e){var t=e.servicesMap,i=e.onEndpointChange,n=Object(z.g)().endpoint,a=t[n=n?decodeURIComponent(n):void 0],s=r.a.createElement("div",null);n&&a&&(s=r.a.createElement(Le,{service:a,key:"testbench-{endpoint}"}));var o=Object(z.f)();return r.a.createElement("div",{className:"tabContent"},r.a.createElement("p",null,"This form lets you test a reconciliation endpoint interactively."),r.a.createElement(pe,{onChange:function(e){i(e),e&&o.push("/client/".concat(encodeURIComponent(e.endpoint)))},initialService:a||{endpoint:n},key:n}),s)}function De(e){var t=e.onEndpointSelect,i=e.style,n=Object(z.f)();return r.a.createElement("div",{className:"tabContent",style:i},r.a.createElement("p",null,"This table lists reconciliation services known to ",r.a.createElement("a",{href:"https://www.wikidata.org/"},"Wikidata")," and indicates which features of the ",r.a.createElement("a",{href:"https://reconciliation-api.github.io/specs/latest/"},"reconciliation API")," they support."),r.a.createElement("p",null,'If you are viewing this app over HTTPS it is likely that reconciliation services using HTTP are blocked as "mixed content". You can disable this protection in your browser to load HTTP reconciliation services.'),r.a.createElement(W,{onSelect:function(e){t(e),n.push("/client/".concat(encodeURIComponent(e.endpoint)))}},r.a.createElement(B,{name:"OpenCorporates",endpoint:"https://opencorporates.com/reconcile",documentation:"https://api.opencorporates.com/documentation/Open-Refine-Reconciliation-API"})))}var Ve=function(e){function t(){var e;return Object(o.a)(this,t),(e=Object(p.a)(this,Object(l.a)(t).call(this))).onEndpointSelect=function(t){var i=Object.assign(e.state.servicesMap);t&&(i[t.endpoint]=t),e.setState({selectedEndpoint:t?t.endpoint:void 0,servicesMap:i,openTab:"testBench"})},e.handleTabSelect=function(t){e.setState({openTab:t})},e.state={selectedEndpoint:"",servicesMap:{},openTab:"servicesList",refreshing:!1,servicesList:[]},e}return Object(u.a)(t,e),Object(c.a)(t,[{key:"render",value:function(){var e=this;return r.a.createElement(G.a,null,r.a.createElement("div",{className:"App",style:{margin:"20px"}},r.a.createElement("h1",null,"Reconciliation service test bench"),r.a.createElement("p",{style:{float:"right"}},r.a.createElement("a",{href:"https://github.com/reconciliation-api/testbench"},"Source repository")),r.a.createElement("ul",{className:"nav nav-tabs"},r.a.createElement(K,{to:"/",title:"Services",exact:"true"}),r.a.createElement(K,{to:"/client/",title:"Test bench"})),r.a.createElement(z.c,null,r.a.createElement(z.a,{path:"/client/:endpoint"},r.a.createElement($e,{servicesMap:this.state.servicesMap,onEndpointChange:this.onEndpointSelect})),r.a.createElement(z.a,{path:"/client/"},r.a.createElement($e,{servicesMap:this.state.servicesMap,onEndpointChange:this.onEndpointSelect}))),r.a.createElement(z.a,{exact:!0,path:"/",children:function(t){var i=t.match;return r.a.createElement(De,{onEndpointSelect:e.onEndpointSelect,style:{display:i?"block":"none"}})}})))}}]),t}(r.a.Component);Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));s.a.render(r.a.createElement(Ve,null),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then(function(e){e.unregister()})}},[[258,1,2]]]); -//# sourceMappingURL=main.92ce8616.chunk.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],{258:function(e,t,i){e.exports=i(638)},263:function(e,t,i){},265:function(e,t,i){},638:function(e,t,i){"use strict";i.r(t);for(var n=i(0),r=i.n(n),a=i(23),s=i.n(a),o=(i(263),i(9)),c=i(10),p=i(12),l=i(11),u=i(13),d=(i(264),i(265),i(251)),h=i.n(d),m=i(69),y=i.n(m),g=i(15),f=i.n(g),v=function(e){function t(){return Object(o.a)(this,t),Object(p.a)(this,Object(l.a)(t).apply(this,arguments))}return Object(u.a)(t,e),Object(c.a)(t,[{key:"render",value:function(){var e="",t="",i="inherit",n="featureCell-default";!0===this.props.value?(e="glyphicon glyphicon-ok",t="available",i="green",n="featureCell-green"):!1===this.props.value?(e="glyphicon glyphicon-remove",t="unavailable",i="#c00000",n="featureCell-red"):"checking"===this.props.value?(e="glyphicon glyphicon-hourglass",t="fetching..."):"maybe"===this.props.value&&(e="glyphicon glyphicon-search",t="Not reachable via CORS, click to check via JSONP",n="featureCell-yellow");var a=r.a.createElement("span",{className:e,"sr-only":t,style:{color:i}}),s=a;return this.props.onClick&&"maybe"===this.props.value&&(s=r.a.createElement(f.a,{onClick:this.props.onClick,bsStyle:"warning",bsSize:"xsmall",title:"Check with JSONP"},a)),r.a.createElement("td",{className:"featureCell "+n},s)}}]),t}(r.a.Component),b=i(60),E=i.n(b),w=function(e,t){var i=new URL(e);return t&&Object.keys(t).forEach(function(e){return i.searchParams.append(e,t[e])}),i.toString()},S=function(e,t){return E()(w(e,t),{timeout:2e4})},j=function(e,t){return fetch(w(e,t))},k={scheme:"monokai",author:"wimer hazenberg (http://www.monokai.nl)",base00:"#000000",base01:"#383830",base02:"#49483e",base03:"#75715e",base04:"#a59f85",base05:"#00ff00",base06:"#f5f4f1",base07:"#f9f8f5",base08:"#f92672",base09:"#fd971f",base0A:"#f4bf75",base0B:"#a6e22e",base0C:"#a1efe4",base0D:"#66d9ef",base0E:"#ae81ff",base0F:"#cc6633"},C=["0.1","latest"],O=i(156),T=i(250),R=new(i.n(T).a)({allErrors:!0}),P={},q=0,x=Object.entries({.1:{"data-extension-query":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/data-extension-query.json",type:"object",description:"This schema validates a data extension query",properties:{ids:{type:"array",description:"The list of entity identifiers to fetch property values from",items:{type:"string"}},properties:{type:"array",description:"The list of properties to fetch, with their optional configuration",items:{type:"object",properties:{id:{type:"string"},settings:{type:"object"}},required:["id"]}}},required:["ids","properties"]},"data-extension-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/data-extension-response.json",type:"object",description:"This schema validates a data extension response",properties:{meta:{type:"array",items:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"object",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]}},required:["id","name"]}},rows:{type:"object",patternProperties:{".*":{type:"object",patternProperties:{".*":{type:"array",items:{oneOf:[{type:"object",additionalProperties:!1},{type:"object",properties:{id:{type:"string"},name:{type:"string"}},required:["id","name"],additionalProperties:!1},{type:"object",properties:{str:{type:"string"}},required:["str"],additionalProperties:!1},{type:"object",properties:{float:{type:"number"}},required:["float"],additionalProperties:!1},{type:"object",properties:{int:{type:"integer"}},required:["int"],additionalProperties:!1},{type:"object",properties:{date:{type:"string",description:"Date and time formatted in ISO format",pattern:"^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\.[0-9]+)?(Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$"}},required:["date"],additionalProperties:!1}]}}}}}}},required:["rows","meta"]},manifest:{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/manifest.json",type:"object",description:"This validates a service manifest, describing the features supported by the endpoint.",properties:{name:{type:"string",description:"A human-readable name for the service or data source"},identifierSpace:{type:"string",description:"A URI describing the entity identifiers used in this service"},schemaSpace:{type:"string",description:"A URI describing the schema used in this service"},view:{type:"object",properties:{url:{type:"string",description:"A template to transform an entity identifier into the corresponding URI",pattern:".*\\{\\{id\\}\\}.*"}},required:["url"]},defaultTypes:{type:"array",description:"A list of default types that are considered good generic choices for reconciliation",items:{type:"object",properties:{id:{type:"string"},name:{type:"string"}},required:["id","name"]},uniqueItems:!0},suggest:{type:"object",description:"Settings for the suggest protocol, to auto-complete entities, properties and types",definitions:{service_definition:{type:"object",properties:{service_url:{type:"string"},service_path:{type:"string"},flyout_service_url:{type:"string"},flyout_service_path:{type:"string",pattern:".*\\$\\{id\\}.*"}},required:[]}},properties:{entity:{$ref:"#/properties/suggest/definitions/service_definition"},property:{$ref:"#/properties/suggest/definitions/service_definition"},type:{$ref:"#/properties/suggest/definitions/service_definition"}}},preview:{type:"object",description:"Settings for the preview protocol, for HTML previews of entities",properties:{url:{type:"string",pattern:".*\\{\\{id\\}\\}.*",description:"A URL pattern which transforms the entity ID into a preview URL for it"},width:{type:"integer",description:"The width of the iframe where to include the HTML preview"},height:{type:"integer",description:"The height of the iframe where to include the HTML preview"}},required:["url","width","height"]},extend:{type:"object",description:"Settings for the data extension protocol, to fetch property values",properties:{propose_properties:{type:"object",description:"Location of the endpoint to propose properties to fetch for a given type",properties:{service_url:{type:"string"},service_path:{type:"string"}}},property_settings:{type:"array",description:"Definition of the settings configurable by the user when fetching a property",items:{oneOf:[{type:"object",description:"Defines a numerical setting on a property",properties:{type:{type:"string",enum:["number"]},default:{type:"number"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"}},required:["type","label","name"]},{type:"object",description:"Defines a string setting on a property",properties:{type:{type:"string",enum:["text"]},default:{type:"string"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"}},required:["type","label","name"]},{type:"object",description:"Defines a boolean setting on a property",properties:{type:{type:"string",enum:["checkbox"]},default:{type:"boolean"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"}},required:["type","label","name"]},{type:"object",description:"Defines a setting with a fixed set of choices",properties:{type:{type:"string",enum:["select"]},default:{type:"string"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"},choices:{type:"array",items:{type:"object",properties:{value:{type:"string"},name:{type:"string"}},required:["value","name"]}}},required:["type","label","name","choices"]}]}}}}},required:["name","identifierSpace","schemaSpace"]},"reconciliation-query-batch":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/reconciliation-query.json",type:"object",description:"This schema validates the JSON serialization of any reconciliation query batch, i.e. the payload of a GET/POST to a reconciliation endpoint.",definitions:{property_value:{oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"object",description:"A property value which represents another entity, for instance if it was previously reconciled itself",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]}]}},patternProperties:{"^.*$":{type:"object",properties:{query:{type:"string",description:"A string to be matched against the name of the entities"},type:{description:"Either a single type identifier or a list of type identifiers",oneOf:[{type:"string"},{type:"array",items:{type:"string"}}]},limit:{type:"number",description:"The maximum number of candidates to return"},properties:{type:"array",description:"An optional list of property mappings to refine the query",items:{type:"object",properties:{pid:{type:"string",description:"The identifier of the property, whose values will be compared to the values supplied"},v:{description:"A value (or array of values) to match against the property values associated with the property on each candidate",oneOf:[{$ref:"#/definitions/property_value"},{type:"array",items:{$ref:"#/definitions/property_value"}}]}},required:["pid","v"]}},type_strict:{type:"string",description:"A classification of the type matching strategy when multiple types are supplied",enum:["any","should","all"]}},required:["query"],additionalProperties:!1}}},"reconciliation-result-batch":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/reconciliation-result-batch.json",type:"object",description:"This schema can be used to validate the JSON\xa0serialization of any reconciliation result batch.",patternProperties:{"^.*$":{type:"object",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Entity identifier of the candidate"},name:{type:"string",description:"Entity name of the candidate"},score:{type:"number",description:"Number indicating how likely it is that the candidate matches the query"},match:{type:"boolean",description:"Boolean value indicating whether the candiate is a certain match or not."},type:{type:"array",description:"Types the candidate entity belongs to",items:{oneOf:[{type:"object",description:"A type can be given by id and name",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]},{type:"string",description:"Alternatively, if only a string is given, it is treated as the id"}]}}},required:["id","name","score"]}}},required:["result"]}}},"suggest-entities-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/suggest-entities-response.json",type:"object",description:"This schema can be used to validate the JSON response of a suggest service for entities.",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Identifier of the suggested entity"},name:{type:"string",description:"Name of the suggested entity"},description:{type:"string",description:"An optional description which can be provided to disambiguate namesakes, providing more context."},notable:{type:"array",description:"Types the suggest entity belongs to",items:{oneOf:[{type:"object",description:"A type can be given by id and name",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]},{type:"string",description:"Alternatively, if only a string is given, it is treated as the id"}]}}},required:["id","name"]}}},required:["result"]},"suggest-properties-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/suggest-properties-response.json",type:"object",description:"This schema can be used to validate the JSON response of a suggest service for properties.",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Identifier of the suggested property"},name:{type:"string",description:"Name of the suggested property"},description:{type:"string",description:"An optional description which can be provided to disambiguate namesakes, providing more context."}},required:["id","name"]}}},required:["result"]},"suggest-types-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/0.1/schemas/suggest-types-response.json",type:"object",description:"This schema can be used to validate the JSON response of a suggest service for types.",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Identifier of the suggested type"},name:{type:"string",description:"Name of the suggested type"},description:{type:"string",description:"An optional description which can be provided to disambiguate namesakes, providing more context."}},required:["id","name"]}}},required:["result"]}},latest:{"data-extension-query":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/data-extension-query.json",type:"object",description:"This schema validates a data extension query",properties:{ids:{type:"array",description:"The list of entity identifiers to fetch property values from",items:{type:"string"}},properties:{type:"array",description:"The list of properties to fetch, with their optional configuration",items:{type:"object",properties:{id:{type:"string"},settings:{type:"object"}},required:["id"]}}},required:["ids","properties"]},"data-extension-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/data-extension-response.json",type:"object",description:"This schema validates a data extension response",properties:{meta:{type:"array",items:{type:"object",properties:{id:{type:"string"},name:{type:"string"},type:{type:"object",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]}},required:["id","name"]}},rows:{type:"object",patternProperties:{".*":{type:"object",patternProperties:{".*":{type:"array",items:{oneOf:[{type:"object",additionalProperties:!1},{type:"object",properties:{id:{type:"string"},name:{type:"string"},description:{type:"string"}},required:["id","name"],additionalProperties:!1},{type:"object",properties:{str:{type:"string"}},required:["str"],additionalProperties:!1},{type:"object",properties:{float:{type:"number"}},required:["float"],additionalProperties:!1},{type:"object",properties:{int:{type:"integer"}},required:["int"],additionalProperties:!1},{type:"object",properties:{date:{type:"string",description:"Date and time formatted in ISO format",pattern:"^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\.[0-9]+)?(Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$"}},required:["date"],additionalProperties:!1}]}}}}}}},required:["rows","meta"]},manifest:{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/manifest.json",type:"object",description:"This validates a service manifest, describing the features supported by the endpoint.",properties:{versions:{type:"array",description:"The list of API versions supported by this service.",items:{type:"string"},contains:{enum:["0.2"]}},name:{type:"string",description:"A human-readable name for the service or data source"},identifierSpace:{type:"string",description:"A URI describing the entity identifiers used in this service"},schemaSpace:{type:"string",description:"A URI describing the schema used in this service"},view:{type:"object",properties:{url:{type:"string",description:"A template to transform an entity identifier into the corresponding URI",pattern:".*\\{\\{id\\}\\}.*"}},required:["url"]},feature_view:{type:"object",properties:{url:{type:"string",description:"A template to transform a matching feature identifier into the corresponding URI",pattern:".*\\{\\{id\\}\\}.*"}},required:["url"]},defaultTypes:{type:"array",description:"A list of default types that are considered good generic choices for reconciliation",items:{type:"object",properties:{id:{type:"string"},name:{type:"string"}},required:["id","name"]},uniqueItems:!0},suggest:{type:"object",description:"Settings for the suggest protocol, to auto-complete entities, properties and types",definitions:{service_definition:{type:"object",properties:{service_url:{type:"string"},service_path:{type:"string"},flyout_service_url:{type:"string"},flyout_service_path:{type:"string",pattern:".*\\$\\{id\\}.*"}},required:[]}},properties:{entity:{$ref:"#/properties/suggest/definitions/service_definition"},property:{$ref:"#/properties/suggest/definitions/service_definition"},type:{$ref:"#/properties/suggest/definitions/service_definition"}}},preview:{type:"object",description:"Settings for the preview protocol, for HTML previews of entities",properties:{url:{type:"string",pattern:".*\\{\\{id\\}\\}.*",description:"A URL pattern which transforms the entity ID into a preview URL for it"},width:{type:"integer",description:"The width of the iframe where to include the HTML preview"},height:{type:"integer",description:"The height of the iframe where to include the HTML preview"}},required:["url","width","height"]},extend:{type:"object",description:"Settings for the data extension protocol, to fetch property values",properties:{propose_properties:{type:"object",description:"Location of the endpoint to propose properties to fetch for a given type",properties:{service_url:{type:"string"},service_path:{type:"string"}}},property_settings:{type:"array",description:"Definition of the settings configurable by the user when fetching a property",items:{oneOf:[{type:"object",description:"Defines a numerical setting on a property",properties:{type:{type:"string",enum:["number"]},default:{type:"number"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"}},required:["type","label","name"]},{type:"object",description:"Defines a string setting on a property",properties:{type:{type:"string",enum:["text"]},default:{type:"string"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"}},required:["type","label","name"]},{type:"object",description:"Defines a boolean setting on a property",properties:{type:{type:"string",enum:["checkbox"]},default:{type:"boolean"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"}},required:["type","label","name"]},{type:"object",description:"Defines a setting with a fixed set of choices",properties:{type:{type:"string",enum:["select"]},default:{type:"string"},label:{type:"string"},name:{type:"string"},help_text:{type:"string"},choices:{type:"array",items:{type:"object",properties:{value:{type:"string"},name:{type:"string"}},required:["value","name"]}}},required:["type","label","name","choices"]}]}}}},serverLimits:{type:"object",description:"Resource constraints imposed by the service on clients",properties:{batchRate:{type:"integer",description:"The number of reconciliation query batch requests which can safely be sent to this service per second per IP address."},maxConnections:{type:"integer",description:"The number of TCP connections which can be concurrently kept open from a single IP address."}}}},required:["versions","name","identifierSpace","schemaSpace"]},"reconciliation-query-batch":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/reconciliation-query.json",type:"object",description:"This schema validates the JSON serialization of any reconciliation query batch, i.e. the payload of a GET/POST to a reconciliation endpoint.",definitions:{property_value:{oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"object",description:"A property value which represents another entity, for instance if it was previously reconciled itself",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]}]}},patternProperties:{"^.*$":{type:"object",properties:{query:{type:"string",description:"A string to be matched against the name of the entities"},type:{description:"Either a single type identifier or a list of type identifiers",oneOf:[{type:"string"},{type:"array",items:{type:"string"}}]},limit:{type:"number",description:"The maximum number of candidates to return"},properties:{type:"array",description:"An optional list of property mappings to refine the query",items:{type:"object",properties:{pid:{type:"string",description:"The identifier of the property, whose values will be compared to the values supplied"},v:{description:"A value (or array of values) to match against the property values associated with the property on each candidate",oneOf:[{$ref:"#/definitions/property_value"},{type:"array",items:{$ref:"#/definitions/property_value"}}]}},required:["pid","v"]}},type_strict:{type:"string",description:"A classification of the type matching strategy when multiple types are supplied",enum:["any","should","all"]}},required:["query"],additionalProperties:!1}}},"reconciliation-result-batch":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/reconciliation-result-batch.json",type:"object",description:"This schema can be used to validate the JSON\xa0serialization of any reconciliation result batch.",patternProperties:{"^.*$":{type:"object",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Entity identifier of the candidate"},name:{type:"string",description:"Entity name of the candidate"},description:{type:"string",description:"Optional description of the candidate entity"},score:{type:"number",description:"Number indicating how likely it is that the candidate matches the query"},features:{type:"array",description:"A list of features which can be used to derive a matching score",items:{type:"object",properties:{id:{type:"string",description:"A unique string identifier for the feature"},value:{description:"The value of the feature for this reconciliation candidate",oneOf:[{type:"boolean"},{type:"number"}]}}}},match:{type:"boolean",description:"Boolean value indicating whether the candiate is a certain match or not."},type:{type:"array",description:"Types the candidate entity belongs to",items:{oneOf:[{type:"object",description:"A type can be given by id and name",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]},{type:"string",description:"Alternatively, if only a string is given, it is treated as the id"}]}}},required:["id","name","score"]}}},required:["result"]}}},"suggest-entities-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/suggest-entities-response.json",type:"object",description:"This schema can be used to validate the JSON response of a suggest service for entities.",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Identifier of the suggested entity"},name:{type:"string",description:"Name of the suggested entity"},description:{type:"string",description:"An optional description which can be provided to disambiguate namesakes, providing more context."},notable:{type:"array",description:"Types the suggest entity belongs to",items:{oneOf:[{type:"object",description:"A type can be given by id and name",properties:{id:{type:"string"},name:{type:"string"}},required:["id"]},{type:"string",description:"Alternatively, if only a string is given, it is treated as the id"}]}}},required:["id","name"]}}},required:["result"]},"suggest-properties-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/suggest-properties-response.json",type:"object",description:"This schema can be used to validate the JSON response of a suggest service for properties.",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Identifier of the suggested property"},name:{type:"string",description:"Name of the suggested property"},description:{type:"string",description:"An optional description which can be provided to disambiguate namesakes, providing more context."}},required:["id","name"]}}},required:["result"]},"suggest-types-response":{$schema:"http://json-schema.org/schema#",$id:"https://reconciliation-api.github.io/specs/latest/schemas/suggest-types-response.json",type:"object",description:"This schema can be used to validate the JSON response of a suggest service for types.",properties:{result:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"Identifier of the suggested type"},name:{type:"string",description:"Name of the suggested type"},description:{type:"string",description:"An optional description which can be provided to disambiguate namesakes, providing more context."}},required:["id","name"]}}},required:["result"]}}});q "),r.a.createElement("span",{className:"suggestItemLabel"},e.name),r.a.createElement("br",null),r.a.createElement("span",{className:"suggestItemDescription"},e.description))}})}},{key:"manifest",get:function(){return this.props.service?this.props.service.manifest:null}}]),t}(r.a.Component),ke=function(e){function t(){var e;return Object(o.a)(this,t),(e=Object(p.a)(this,Object(l.a)(t).call(this))).onSuggestChange=function(t){e.setState({value:t}),void 0!==e.props.onChange&&e.props.onChange(t)},e.onIdChange=function(t){var i={id:t.currentTarget.value,name:t.currentTarget.value};void 0===e.props.onChange?e.setState({value:i}):void 0===e.props.explicitSubmit?e.props.onChange(i):e.setState({value:i})},e.onSubmit=function(t){e.props.onChange(e.state.value),t.preventDefault()},e.state={value:void 0},e}return Object(u.a)(t,e),Object(c.a)(t,[{key:"getValue",value:function(){return void 0!==this.props.onChange?this.props.value:this.state.value}},{key:"render",value:function(){return this.hasAutocomplete?r.a.createElement(je,{service:this.props.service,entityClass:this.props.entityClass,onChange:this.onSuggestChange,value:this.currentValue}):void 0!==this.props.explicitSubmit?r.a.createElement(fe.a,null,r.a.createElement(ie.a,{type:"text",placeholder:this.placeholder,value:this.currentId||"",onChange:this.onIdChange}),r.a.createElement(fe.a.Button,null,r.a.createElement(f.a,{onClick:this.onSubmit,type:"submit",bsStyle:"primary"},"Submit"))):r.a.createElement(ie.a,{type:"text",placeholder:this.placeholder,value:this.currentId||"",onChange:this.onIdChange})}},{key:"manifest",get:function(){return this.props.service?this.props.service.manifest:null}},{key:"placeholder",get:function(){return this.props.entityClass+" id"}},{key:"currentValue",get:function(){return void 0===this.props.onChange?this.state.value:this.props.value||this.state.value}},{key:"currentId",get:function(){var e=this.currentValue;return void 0===e?void 0:e.id}},{key:"hasAutocomplete",get:function(){return this.manifest&&this.manifest.suggest&&this.manifest.suggest[this.props.entityClass]}}]),t}(r.a.Component),Ce=function(e){function t(){var e,i;Object(o.a)(this,t);for(var n=arguments.length,r=new Array(n),a=0;a0&&", ",e.name+" ("+e.id+")"]})))}},{key:"renderFeatures",value:function(){var e=this.props.candidate.features;if(void 0!==e)return r.a.createElement("div",null,e.map(function(e,t){return r.a.createElement("div",{key:t},r.a.createElement("div",{className:"candidateField"},"Feature ",e.id),r.a.createElement("div",{className:"candidateValue"},e.value))}))}},{key:"render",value:function(){var e=this.props.candidate;return r.a.createElement(Pe.a,{key:e.id,header:e.name,active:e.match},r.a.createElement(Te.a,{style:{float:"right"}},this.props.candidate.score),r.a.createElement("div",null,r.a.createElement("div",null,r.a.createElement("div",{className:"candidateField"},"ID"),r.a.createElement("div",{className:"candidateValue"},r.a.createElement("a",{href:this.url},e.id))),this.renderDescription(),this.renderTypes(),this.renderFeatures()))}},{key:"url",get:function(){var e=null;return"view"in this.props.manifest&&"url"in this.props.manifest.view&&"id"in this.props.candidate&&(e=this.props.manifest.view.url.replace("{{id}}",this.props.candidate.id)),e}}]),t}(r.a.Component),xe=function(e){function t(){var e,i;Object(o.a)(this,t);for(var n=arguments.length,r=new Array(n),a=0;aThe manifest must provide the width and height of the preview iframe as integers.

"};try{return new URL(e),{__html:'')}}catch(t){return{__html:"

Invalid URL generated by the preview service URL template.

"}}},i}return Object(u.a)(t,e),Object(c.a)(t,[{key:"render",value:function(){return r.a.createElement("div",null,void 0===this.props.id?r.a.createElement("div",null):r.a.createElement("div",{dangerouslySetInnerHTML:this.iframe()}))}}]),t}(r.a.Component),Ne=function(e){function t(){return Object(o.a)(this,t),Object(p.a)(this,Object(l.a)(t).apply(this,arguments))}return Object(u.a)(t,e),Object(c.a)(t,[{key:"render",value:function(){return r.a.createElement(Pe.a,{key:this.props.key,header:this.renderedValue},this.datatype)}},{key:"renderedValue",get:function(){var e=this.props.value;return void 0!==e.date?e.date:void 0!==e.id&&void 0!==e.name?e.name:void 0!==e.str?e.str:void 0!==e.float?e.float:void 0!==e.int?e.int:"Singleton"}},{key:"datatype",get:function(){var e=this.props.value;return void 0!==e.date?"date":void 0!==e.id&&void 0!==e.name?e.id:void 0!==e.str?"string":void 0!==e.float?"floating-point number":void 0!==e.int?"integer":"empty"}}]),t}(r.a.Component),_e=i(97),Ie=i.n(_e),Ae=function(e){function t(){var e;return Object(o.a)(this,t),(e=Object(p.a)(this,Object(l.a)(t).call(this))).onEntityChange=function(t){e.setState({entity:t,extendResults:void 0,validationErrors:[]})},e.onPropertyChange=function(t){e.setState({property:t,extendResults:void 0,validationErrors:[]})},e.resetQuery=function(t){t.preventDefault(),e.setState({entity:void 0,property:void 0,extendResults:void 0,validationErrors:void 0})},e.submitQuery=function(t){t.preventDefault(),e.setState({extendResults:"fetching"}),e.props.service.getFetcher()(e.formulateQueryUrl(),{timeout:2e4}).then(function(e){return e.json()}).then(function(t){return e.setState({extendResults:t,validationErrors:e.validateServiceResponse(t)})}).catch(function(t){e.setState({exdentResults:"failed",extendError:t.message})})},e.state={entity:void 0,property:void 0,extendResults:void 0,validationErrors:[]},e}return Object(u.a)(t,e),Object(c.a)(t,[{key:"formulateQuery",value:function(){return void 0!==this.state.entity&&void 0!==this.state.property?{ids:[this.state.entity.id],properties:[{id:this.state.property.id}]}:{}}},{key:"formulateQueryUrl",value:function(){var e=this.props.service.endpoint;if(!e)return"#";var t={extend:JSON.stringify(this.formulateQuery())},i=new URL(e);return Object.keys(t).forEach(function(e){return i.searchParams.append(e,t[e])}),i.toString()}},{key:"renderResponseValidationErrors",value:function(){return r.a.createElement("div",null)}},{key:"renderQueryResults",value:function(){if("fetching"===this.state.extendResults)return r.a.createElement("div",{className:"resultsPlaceholder"},"Querying the service...");if("failed"===this.state.extendResults)return r.a.createElement("div",{className:"resultsPlaceholder"},"Error: ",this.state.extendError);if(void 0===this.state.extendResults||void 0===this.state.entity||void 0===this.state.property)return r.a.createElement("div",null);if(void 0===this.state.extendResults.rows)return r.a.createElement("span",{className:"resultsPlaceholder"},"No ",r.a.createElement("code",null,"rows")," attribute in the response.");if(void 0===this.state.extendResults.rows[this.state.entity.id])return r.a.createElement("span",{className:"resultsPlaceholder"},"Missing ",r.a.createElement("code",null,"rows.",this.state.entity.id)," object in the response.");if(void 0===this.state.extendResults.rows[this.state.entity.id][this.state.property.id])return r.a.createElement("span",{className:"resultsPlaceholder"},"Missing ",r.a.createElement("code",null,"rows.",this.state.entity.id,this.state.property.id)," object in the response.");var e=this.state.extendResults.rows[this.state.entity.id][this.state.property.id];return 0===e.length?r.a.createElement("span",{className:"noResults"},"No results"):r.a.createElement(we.a,null,e.map(function(e,t){return r.a.createElement(Ne,{value:e,key:"data-extension-result-"+t})}))}},{key:"validateServiceResponse",value:function(e){var t=Q(this.props.service.latestCompatibleVersion,"data-extension-response");return t(e)?[]:t.errors.map(function(e){return e.dataPath+" "+e.message})}},{key:"render",value:function(){return r.a.createElement("div",null,r.a.createElement(ce.a,{sm:5},r.a.createElement(Z.a,{horizontal:!0},r.a.createElement(ee.a,{controlId:"dataExtensionEntity"},r.a.createElement(ce.a,{componentClass:re.a,sm:2},"Entity:"),r.a.createElement(ce.a,{sm:10},r.a.createElement(ke,{service:this.props.service,placeholder:"Entity to fetch data from",value:this.state.entity,entityClass:"entity",onChange:this.onEntityChange}))),r.a.createElement(ee.a,{controlId:"dataExtensionProperty"},r.a.createElement(ce.a,{componentClass:re.a,sm:2},"Property:"),r.a.createElement(ce.a,{sm:10},r.a.createElement(ke,{service:this.props.service,placeholder:"Property to fetch on the entity",value:this.state.property,entityClass:"property",onChange:this.onPropertyChange}))),r.a.createElement(ee.a,{controlId:"submitGroup"},r.a.createElement(ce.a,{sm:10}),r.a.createElement(ce.a,{sm:2},r.a.createElement(fe.a,null,r.a.createElement(fe.a.Button,null,r.a.createElement(f.a,{onClick:this.resetQuery,type:"submit",bsStyle:"default"},"Reset")),r.a.createElement(fe.a.Button,null,r.a.createElement(f.a,{onClick:this.submitQuery,type:"submit",bsStyle:"primary"},"Submit"))))))),r.a.createElement(ce.a,{sm:3},r.a.createElement(Ie.a,{theme:k,data:this.formulateQuery(),getItemString:function(e,t,i,n){return""},shouldExpandNode:function(e,t,i){return!0},hideRoot:!0}),r.a.createElement("br",null),r.a.createElement("a",{href:this.formulateQueryUrl(),title:"See query results on the service",target:"_blank",rel:"noopener noreferrer"},"View query results on the service"),this.renderResponseValidationErrors()),r.a.createElement(ce.a,{sm:4},this.renderQueryResults()))}}]),t}(r.a.Component),Le=function(e){function t(){var e;return Object(o.a)(this,t),(e=Object(p.a)(this,Object(l.a)(t).call(this))).onReconQueryChange=function(t){e.setState({reconQuery:t.currentTarget.value})},e.onReconTypeChange=function(t){e.setState({reconType:t.currentTarget.value})},e.onCustomTypeChange=function(t){e.setState({reconCustomType:t})},e.onReconPropertiesChange=function(t){e.setState({reconProperties:t})},e.onReconLimitChange=function(t){e.setState({reconLimit:t.currentTarget.value})},e.onPreviewEntityChange=function(t){e.setState({previewEntityId:void 0!==t?t.id:void 0})},e.onSubmitReconciliation=function(t){(t.preventDefault(),e.props.service&&e.props.service.endpoint)&&(e.setState({reconResults:"fetching"}),e.props.service.getFetcher()(e.formulateQueryUrl(),{timeout:2e4}).then(function(e){return e.json()}).then(function(t){return e.setState({reconResults:t.q0.result,reconResponseValidationErrors:e.validateServiceResponse("reconciliation-result-batch",t)})}).catch(function(t){e.setState({reconError:t.message,reconResults:"failed"})}))},e.state={reconQuery:"",reconType:"no-type",reconCustomType:void 0,reconProperties:[],reconLimit:void 0,reconResponseValidationErrors:[],previewEntityId:void 0},e}return Object(u.a)(t,e),Object(c.a)(t,[{key:"validateServiceResponse",value:function(e,t){var i=Q(this.props.service.latestCompatibleVersion,e);return i(t)?[]:i.errors.map(function(e){return e.dataPath+" "+e.message})}},{key:"renderQueryResults",value:function(){var e=this;return"fetching"===this.state.reconResults?r.a.createElement("div",{className:"resultsPlaceholder"},"Querying the service..."):"failed"===this.state.reconResults?r.a.createElement("div",{className:"resultsPlaceholder"},"Error: ",this.state.reconError):void 0===this.state.reconResults?r.a.createElement("div",null):0===this.state.reconResults.length?r.a.createElement("span",{className:"noResults"},"No results"):r.a.createElement(we.a,null,this.state.reconResults.map(function(t){return r.a.createElement(qe,{candidate:t,manifest:e.props.service.manifest})}))}},{key:"renderReconResponseValidationErrors",value:function(){return 0===this.state.reconResponseValidationErrors.length?r.a.createElement("div",null):r.a.createElement(ue.a,{bsStyle:"warning"},r.a.createElement("strong",null,"Validations error for reconcilation response"),r.a.createElement("ul",null,this.state.reconResponseValidationErrors.map(function(e,t){return r.a.createElement("li",{key:t},e)})))}},{key:"renderManifestValidationErrors",value:function(){var e=this.props.service.manifest,t=this.validateServiceResponse("manifest",e);return 0===t.length?r.a.createElement("div",null):r.a.createElement(ue.a,{bsStyle:"warning"},r.a.createElement("strong",null,"Validation errors for service manifest"),r.a.createElement("ul",null,t.map(function(e,t){return r.a.createElement("li",{key:t},e)})))}},{key:"formulateReconQuery",value:function(){var e={query:this.state.reconQuery};return"custom-type"===this.state.reconType&&void 0!==this.state.reconCustomType?e.type=this.state.reconCustomType.id:"no-type"!==this.state.reconType&&(e.type=this.state.reconType),this.state.reconProperties.length>0&&(e.properties=this.state.reconProperties.filter(function(e){return void 0!==e&&e.property&&e.value}).map(function(e){return{pid:e.property.id,v:e.value}})),isNaN(parseInt(this.state.reconLimit))||(e.limit=parseInt(this.state.reconLimit)),e}},{key:"formulateQueryUrl",value:function(){var e=this.props.service.endpoint;if(!e)return"#";var t={queries:JSON.stringify({q0:this.formulateReconQuery()})},i=new URL(e);return Object.keys(t).forEach(function(e){return i.searchParams.append(e,t[e])}),i.toString()}},{key:"renderTypeChoices",value:function(){var e=this,t=this.state.reconType,i=this.defaultTypes.map(function(i){return r.a.createElement(be.a,{name:"reconcileType",key:"key_"+i.id,value:i.id,checked:t===i.id,onChange:e.onReconTypeChange},i.name,r.a.createElement("br",null),Array.isArray(i.broader)&&i.broader.length&&r.a.createElement("span",{className:"reconTypeId"},i.broader.map(function(e){return e.id}).join(", ")," > "),r.a.createElement("span",{className:"reconTypeId"},i.id))});return this.hasTypeSuggest&&i.push(r.a.createElement(be.a,{name:"reconcileType",key:"custom-type",value:"custom-type",checked:"custom-type"===t,onChange:this.onReconTypeChange},"Custom:",r.a.createElement("div",null,r.a.createElement(je,{service:this.props.service,entityClass:"type",id:"recon-custom-type-suggest",value:this.state.reconCustomType,onChange:this.onCustomTypeChange})))),i.push(r.a.createElement(be.a,{name:"reconcileType",key:"no-type",value:"no-type",checked:"no-type"===t,onChange:this.onReconTypeChange},"Reconcile against no particular type")),i}},{key:"render",value:function(){var e=this;return r.a.createElement("div",null,this.renderManifestValidationErrors(),r.a.createElement(he.a,{defaultActiveKey:"reconcile",animation:!1,id:"test-bench-tabs"},r.a.createElement(ye.a,{eventKey:"reconcile",title:"Reconcile"},r.a.createElement("div",{className:"tabContent"},r.a.createElement(ce.a,{sm:5},r.a.createElement(Z.a,{horizontal:!0},r.a.createElement(ee.a,{controlId:"reconcileName"},r.a.createElement(ce.a,{componentClass:re.a,sm:2},"Name:"),r.a.createElement(ce.a,{sm:10},r.a.createElement(fe.a,null,r.a.createElement(ie.a,{type:"text",placeholder:"Entity to reconcile",value:this.state.reconQuery,onChange:this.onReconQueryChange}),r.a.createElement(fe.a.Button,null,r.a.createElement(f.a,{onClick:this.onSubmitReconciliation,type:"submit",bsStyle:"primary",disabled:!this.props.service},"Reconcile"))))),r.a.createElement(ee.a,{controlId:"reconcileType"},r.a.createElement(ce.a,{componentClass:re.a,sm:2},"Type:"),r.a.createElement(ce.a,{sm:10},this.renderTypeChoices())),r.a.createElement(ee.a,{controlId:"reconcileProperties"},r.a.createElement(ce.a,{componentClass:re.a,sm:2},"Properties:"),r.a.createElement(ce.a,{sm:10},r.a.createElement(Ce,{service:this.props.service,value:this.state.reconProperties,onChange:this.onReconPropertiesChange}))),r.a.createElement(ee.a,{controlId:"reconcileLimit"},r.a.createElement(ce.a,{componentClass:re.a,sm:2},"Limit:"),r.a.createElement(ce.a,{sm:10},r.a.createElement(ie.a,{type:"number",placeholder:"Maximum number of candidates",value:this.state.reconLimit,onChange:function(t){return e.onReconLimitChange(t)}}))))),r.a.createElement(ce.a,{sm:3},r.a.createElement(Ie.a,{theme:k,data:this.formulateReconQuery(),getItemString:function(e,t,i,n){return""},shouldExpandNode:function(e,t,i){return!0},hideRoot:!0}),r.a.createElement("br",null),r.a.createElement("a",{href:this.formulateQueryUrl(),title:"See query results on the service",target:"_blank",rel:"noopener noreferrer"},"View query results on the service"),this.renderReconResponseValidationErrors()),r.a.createElement(ce.a,{sm:4},this.renderQueryResults()))),r.a.createElement(ye.a,{eventKey:"suggest",title:"Suggest"},r.a.createElement("div",{className:"tabContent"},r.a.createElement(Z.a,{horizontal:!0},r.a.createElement(ee.a,{controlId:"suggestEntityTestBench"},r.a.createElement(ce.a,{componentClass:re.a,sm:1},"Entity:"),r.a.createElement(ce.a,{sm:11},r.a.createElement(je,{service:this.props.service,entityClass:"entity",id:"entity-suggest-test"}))),r.a.createElement(ee.a,{controlId:"suggestTypeTestBench"},r.a.createElement(ce.a,{componentClass:re.a,sm:1},"Type:"),r.a.createElement(ce.a,{sm:11},r.a.createElement(je,{service:this.props.service,entityClass:"type",id:"type-suggest-test"}))),r.a.createElement(ee.a,{controlId:"suggestPropertyTestBench"},r.a.createElement(ce.a,{componentClass:re.a,sm:1},"Property:"),r.a.createElement(ce.a,{sm:11},r.a.createElement(je,{service:this.props.service,entityClass:"property",id:"property-suggest-test"})))))),r.a.createElement(ye.a,{eventKey:"preview",title:"Preview",disabled:!this.hasPreviewService},r.a.createElement("div",{className:"tabContent"},this.hasPreviewService?r.a.createElement("div",null,r.a.createElement(Z.a,{horizontal:!0},r.a.createElement(ee.a,{controlId:"suggestEntityTestBench"},r.a.createElement(ce.a,{componentClass:re.a,sm:1},"Entity:"),r.a.createElement(ce.a,{sm:11},r.a.createElement(ke,{service:this.props.service,entityClass:"entity",id:"entity-input-preview",explicitSubmit:!0,onChange:this.onPreviewEntityChange})))),r.a.createElement(xe,{id:this.state.previewEntityId,settings:this.props.service.manifest.preview})):r.a.createElement("p",null,"Previewing is not supported by the service."))),r.a.createElement(ye.a,{eventKey:"extend",title:"Extend",disabled:!this.hasDataExtension},r.a.createElement("div",{className:"tabContent"},this.hasDataExtension?r.a.createElement(Ae,{service:this.props.service}):r.a.createElement("p",null,"Data extension is not supported by the service.")))))}},{key:"defaultTypes",get:function(){return this.props.service&&this.props.service.manifest&&this.props.service.manifest.defaultTypes||[]}},{key:"hasTypeSuggest",get:function(){return this.props.service&&this.props.service.manifest&&this.props.service.manifest.suggest&&this.props.service.manifest.suggest.type}},{key:"hasPropertySuggest",get:function(){return this.props.service&&this.props.service.manifest&&this.props.service.manifest.suggest&&this.props.service.manifest.suggest.property}},{key:"hasPreviewService",get:function(){return this.props.service&&this.props.service.manifest&&this.props.service.manifest.preview}},{key:"hasDataExtension",get:function(){return this.props.service&&this.props.service.manifest&&this.props.service.manifest.extend}}]),t}(r.a.Component);function $e(e){var t=e.servicesMap,i=e.onEndpointChange,n=Object(z.g)().endpoint,a=t[n=n?decodeURIComponent(n):void 0],s=r.a.createElement("div",null);n&&a&&(s=r.a.createElement(Le,{service:a,key:"testbench-{endpoint}"}));var o=Object(z.f)();return r.a.createElement("div",{className:"tabContent"},r.a.createElement("p",null,"This form lets you test a reconciliation endpoint interactively."),r.a.createElement(pe,{onChange:function(e){i(e),e&&o.push("/client/".concat(encodeURIComponent(e.endpoint)))},initialService:a||{endpoint:n},key:n}),s)}function De(e){var t=e.onEndpointSelect,i=e.style,n=Object(z.f)();return r.a.createElement("div",{className:"tabContent",style:i},r.a.createElement("p",null,"This table lists reconciliation services known to ",r.a.createElement("a",{href:"https://www.wikidata.org/"},"Wikidata")," and indicates which features of the ",r.a.createElement("a",{href:"https://reconciliation-api.github.io/specs/latest/"},"reconciliation API")," they support. See also our ",r.a.createElement("a",{href:"https://reconciliation-api.github.io/census/"},"census")," which lists client and server software that use the API."),r.a.createElement("p",null,'If you are viewing this app over HTTPS it is likely that reconciliation services using HTTP are blocked as "mixed content". You can disable this protection in your browser to load HTTP reconciliation services.'),r.a.createElement(W,{onSelect:function(e){t(e),n.push("/client/".concat(encodeURIComponent(e.endpoint)))}},r.a.createElement(B,{name:"OpenCorporates",endpoint:"https://opencorporates.com/reconcile",documentation:"https://api.opencorporates.com/documentation/Open-Refine-Reconciliation-API"})))}var Ve=function(e){function t(){var e;return Object(o.a)(this,t),(e=Object(p.a)(this,Object(l.a)(t).call(this))).onEndpointSelect=function(t){var i=Object.assign(e.state.servicesMap);t&&(i[t.endpoint]=t),e.setState({selectedEndpoint:t?t.endpoint:void 0,servicesMap:i,openTab:"testBench"})},e.handleTabSelect=function(t){e.setState({openTab:t})},e.state={selectedEndpoint:"",servicesMap:{},openTab:"servicesList",refreshing:!1,servicesList:[]},e}return Object(u.a)(t,e),Object(c.a)(t,[{key:"render",value:function(){var e=this;return r.a.createElement(G.a,null,r.a.createElement("div",{className:"App",style:{margin:"20px"}},r.a.createElement("h1",null,"Reconciliation service test bench"),r.a.createElement("p",{style:{float:"right"}},r.a.createElement("a",{href:"https://github.com/reconciliation-api/testbench"},"Source repository")),r.a.createElement("ul",{className:"nav nav-tabs"},r.a.createElement(K,{to:"/",title:"Services",exact:"true"}),r.a.createElement(K,{to:"/client/",title:"Test bench"})),r.a.createElement(z.c,null,r.a.createElement(z.a,{path:"/client/:endpoint"},r.a.createElement($e,{servicesMap:this.state.servicesMap,onEndpointChange:this.onEndpointSelect})),r.a.createElement(z.a,{path:"/client/"},r.a.createElement($e,{servicesMap:this.state.servicesMap,onEndpointChange:this.onEndpointSelect}))),r.a.createElement(z.a,{exact:!0,path:"/",children:function(t){var i=t.match;return r.a.createElement(De,{onEndpointSelect:e.onEndpointSelect,style:{display:i?"block":"none"}})}})))}}]),t}(r.a.Component);Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));s.a.render(r.a.createElement(Ve,null),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then(function(e){e.unregister()})}},[[258,1,2]]]); +//# sourceMappingURL=main.847225ed.chunk.js.map \ No newline at end of file diff --git a/static/js/main.847225ed.chunk.js.map b/static/js/main.847225ed.chunk.js.map new file mode 100644 index 0000000..5bdc07e --- /dev/null +++ b/static/js/main.847225ed.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["JsonValidator.js","FeatureCell.js","utils.js","JsonSchemas.js","ReconciliationService.js","FeatureRow.js","FeatureTable.js","TabLink.js","ReconciliationServiceInput.js","ReconcileSuggest.js","GenericInput.js","PropertyMapping.js","Candidate.js","PreviewRenderer.js","DataExtensionValue.js","DataExtensionTab.js","TestBench.js","App.js","serviceWorker.js","index.js"],"names":["FeatureCell","glyph","text","color","cellClass","this","props","value","span","react_default","a","createElement","className","sr-only","style","link","onClick","Button_default","bsStyle","bsSize","title","React","Component","addParams","baseUrl","params","url","URL","Object","keys","forEach","key","searchParams","append","toString","fetchJsonpParams","fetchJsonp","timeout","fetchParams","fetch","jsonTheme","scheme","author","base00","base01","base02","base03","base04","base05","base06","base07","base08","base09","base0A","base0B","base0C","base0D","base0E","base0F","specVersions","validatorAjv","Ajv","allErrors","compiledSchemas","_i","_Object$entries","entries","0.1","data-extension-query","$schema","$id","type","description","properties","ids","items","id","settings","required","data-extension-response","meta","name","rows","patternProperties",".*","oneOf","additionalProperties","str","float","int","date","pattern","manifest","identifierSpace","schemaSpace","view","defaultTypes","uniqueItems","suggest","definitions","service_definition","service_url","service_path","flyout_service_url","flyout_service_path","entity","$ref","property","preview","width","height","extend","propose_properties","property_settings","enum","default","label","help_text","choices","reconciliation-query-batch","property_value","^.*$","query","limit","pid","v","type_strict","reconciliation-result-batch","result","score","match","suggest-entities-response","notable","suggest-properties-response","suggest-types-response","latest","versions","contains","feature_view","serverLimits","batchRate","maxConnections","features","length","JsonValidator_ref3","JsonValidator_ref2","slicedToArray","version","schemas","compiled","_i2","_Object$entries2","_ref6","_ref5","schema","compile","getSchema","schemaName","ReconciliationService","endpoint","cors","classCallCheck","latestCompatibleVersion","_iteratorNormalCompletion","_didIteratorError","_iteratorError","undefined","_step","_iterator","Symbol","iterator","next","done","err","return","FeatureRow","_this","possibleConstructorReturn","getPrototypeOf","call","checkJsonp","setState","reacheableJSONP","then","response","json","catch","error","triggerOnSelect","onSelect","reconciliationService","state","reacheableCORS","_this2","jsonp","isReacheable","suggestSettings","parts","documentation","source_url","push","href","target","rel","wd_uri","nameCell","disabled","FeatureCell_FeatureCell","hasView","hasSuggestEntity","hasSuggestType","hasSuggestProperty","hasPreview","hasExtend","Row","FeatureTable","refreshServicesFromWD","method","refreshing","sparql_query","format","promise","urlParams","URLSearchParams","mode","cache","headers","Content-Type","body","services","results","bindings","map","entry","serviceLabel","source","service","console","log","loadAllJsonp","row","useJsonp","openAddServiceDialog","showAddServiceDialog","closeAddServiceDialog","Fragment","Table_default","striped","bordered","hover","FeatureRow_FeatureRow","Modal_default","show","onHide","Header","closeButton","Title","Body","sparqlQueryUrl","encodeURIComponent","TabLink","_ref","to","exact","useRouteMatch","path","role","react_router_dom","ReconciliationServiceInput","initialService","timer","validateEndpoint","e","clearTimeout","setTimeout","_this3","_setService","_setError","onChange","message","getValidationState","startsWith","preventDefault","_this4","Form_default","horizontal","onSubmit","handleSubmit","FormGroup_default","controlId","validationState","Col_default","componentClass","ControlLabel","sm","FormControl_default","placeholder","handleChange","Feedback","HelpBlock_default","getMessage","ReconcileSuggest","onSuggestionsFetchRequested","getUrl","prefix","isLoading","getFetcher","fetcher","suggestions","onSuggestionsClearRequested","newValue","configuration","entityClass","lib","onSearch","options","labelKey","filterBy","option","selected","getValue","renderMenuItemChildren","index","Array","isArray","broader","join","GenericInput","onSuggestChange","onIdChange","currentTarget","explicitSubmit","hasAutocomplete","ReconcileSuggest_ReconcileSuggest","currentValue","InputGroup_default","currentId","Button","val","PropertyMapping","newMapping","emitChange","concat","deleteMapping","idx","newArray","slice","splice","onValueChange","onPropertyChange","propertyValue","mapping","display","marginBottom","GenericInput_GenericInput","renderMappings","Candidate","candidate","types","feature","ListGroupItem_default","header","active","Badge_default","renderDescription","renderTypes","renderFeatures","replace","PreviewRenderer","iframe","iframeUrl","Number","isInteger","__html","_","dangerouslySetInnerHTML","DataExtensionValue","renderedValue","datatype","DataExtensionTab","onEntityChange","extendResults","validationErrors","resetQuery","submitQuery","formulateQueryUrl","validateServiceResponse","exdentResults","extendError","JSON","stringify","formulateQuery","values","ListGroup_default","DataExtensionValue_DataExtensionValue","errors","dataPath","react_json_tree_lib_default","theme","data","getItemString","itemType","itemString","shouldExpandNode","keyName","level","hideRoot","renderResponseValidationErrors","renderQueryResults","TestBench","onReconQueryChange","reconQuery","onReconTypeChange","reconType","onCustomTypeChange","reconCustomType","onReconPropertiesChange","reconProperties","onReconLimitChange","reconLimit","onPreviewEntityChange","previewEntityId","onSubmitReconciliation","reconResults","q0","reconResponseValidationErrors","reconError","Candidate_Candidate","Alert_default","filter","m","isNaN","parseInt","queries","formulateReconQuery","current","t","Radio_default","checked","hasTypeSuggest","renderManifestValidationErrors","Tabs_default","defaultActiveKey","animation","Tab_default","eventKey","renderTypeChoices","PropertyMapping_PropertyMapping","renderReconResponseValidationErrors","hasPreviewService","PreviewRenderer_PreviewRenderer","hasDataExtension","DataExtensionTab_DataExtensionTab","TestbenchTab","servicesMap","onEndpointChange","useParams","decodeURIComponent","testBench","TestBench_TestBench","history","useHistory","ReconciliationServiceInput_ReconciliationServiceInput","TableTab","_ref2","onEndpointSelect","FeatureTable_FeatureTable","App","newServicesMap","assign","selectedEndpoint","openTab","handleTabSelect","servicesList","margin","react_router","children","_ref3","Boolean","window","location","hostname","ReactDOM","render","App_App","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.847225ed.chunk.js","sourcesContent":["import Ajv from 'ajv';\nimport { specSchemas } from './JsonSchemas.js';\n\n\nconst validatorAjv = new Ajv({allErrors: true});\n\n// compiled cache of all schemas involved in the specs\nconst compiledSchemas = {};\n\nfor (let [version, schemas] of Object.entries(specSchemas)) {\n\tlet compiled = {};\n\tfor (let [name, schema] of Object.entries(schemas)) {\n\t\tcompiled[name] = validatorAjv.compile(schema);\n\t}\n\tcompiledSchemas[version] = compiled;\n}\n\n/**\n * Returns the schema validator for a given version and a type of object.\n */\nexport const getSchema = (version, schemaName) => {\n\tlet actualVersion = version === null ? '0.1' : version;\n\treturn compiledSchemas[actualVersion][schemaName];\n}\n\n\n","\nimport React from 'react';\nimport Button from 'react-bootstrap/lib/Button';\n\nexport default class FeatureCell extends React.Component {\n render() {\n let glyph = '';\n let text = '';\n let color = 'inherit';\n let cellClass = 'featureCell-default';\n if (this.props.value === true) {\n glyph = 'glyphicon glyphicon-ok';\n text = 'available';\n color = 'green';\n cellClass = 'featureCell-green';\n } else if (this.props.value === false) {\n glyph = 'glyphicon glyphicon-remove';\n text = 'unavailable';\n color = '#c00000';\n cellClass = 'featureCell-red';\n } else if (this.props.value === 'checking') {\n glyph = 'glyphicon glyphicon-hourglass';\n text = 'fetching...';\n } else if (this.props.value === 'maybe') {\n glyph = 'glyphicon glyphicon-search';\n text = 'Not reachable via CORS, click to check via JSONP';\n cellClass = 'featureCell-yellow';\n }\n let span = ;\n let link = span;\n if (this.props.onClick && this.props.value === 'maybe') {\n link = \n }\n return (\n \n {link}\n \n );\n }\n}\n","\nimport fetchJsonp from 'fetch-jsonp';\n\nconst addParams = (baseUrl, params) => {\n let url = new URL(baseUrl);\n if (params) {\n Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));\n }\n return url.toString();\n}\n\nexport const fetchJsonpParams = (baseUrl, params) => {\n return fetchJsonp(addParams(baseUrl, params), {timeout: 20000});\n} \n\nexport const fetchParams = (baseUrl, params) => {\n return fetch(addParams(baseUrl, params));\n}\n\nexport const jsonTheme = {\n scheme: 'monokai',\n author: 'wimer hazenberg (http://www.monokai.nl)',\n base00: '#000000', // '#272822',\n base01: '#383830',\n base02: '#49483e',\n base03: '#75715e',\n base04: '#a59f85',\n base05: '#00ff00', //'#f8f8f2',\n base06: '#f5f4f1',\n base07: '#f9f8f5',\n base08: '#f92672',\n base09: '#fd971f',\n base0A: '#f4bf75',\n base0B: '#a6e22e',\n base0C: '#a1efe4',\n base0D: '#66d9ef',\n base0E: '#ae81ff',\n base0F: '#cc6633'\n };\n\n\n","// This file was automatically generated by utils/collect_schemas.sh\n// The schemas are stored in the reconciliation-api/specs repository.\n// If any changes to the schema should be made, please do it there instead!\n// Any local changes will be overridden by the next update.\n\nexport const specVersions = [\n\"0.1\",\n\"latest\",\n];\n\nexport const specSchemas = {\n\"0.1\": {\n\"data-extension-query\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/data-extension-query.json\",\n \"type\": \"object\",\n \"description\": \"This schema validates a data extension query\",\n \"properties\": {\n \"ids\": {\n \"type\": \"array\",\n \"description\": \"The list of entity identifiers to fetch property values from\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"properties\": {\n \"type\": \"array\",\n \"description\": \"The list of properties to fetch, with their optional configuration\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"settings\": {\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"id\"\n ]\n }\n }\n },\n \"required\": [\n \"ids\",\n \"properties\"\n ]\n}\n,\n\"data-extension-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/data-extension-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema validates a data extension response\",\n \"properties\": {\n \"meta\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n },\n \"rows\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \".*\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \".*\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"str\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"str\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"float\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"float\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"int\": {\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"int\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"date\": {\n \"type\": \"string\",\n \"description\": \"Date and time formatted in ISO format\",\n \"pattern\": \"^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\\\.[0-9]+)?(Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$\"\n }\n },\n \"required\": [\n \"date\"\n ],\n \"additionalProperties\": false\n }\n ]\n }\n }\n }\n }\n }\n }\n },\n \"required\": [\n \"rows\",\n \"meta\"\n ]\n}\n,\n\"manifest\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/manifest.json\",\n \"type\": \"object\",\n \"description\": \"This validates a service manifest, describing the features supported by the endpoint.\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"A human-readable name for the service or data source\"\n },\n \"identifierSpace\": {\n \"type\": \"string\",\n \"description\": \"A URI describing the entity identifiers used in this service\"\n },\n \"schemaSpace\": {\n \"type\": \"string\",\n \"description\": \"A URI describing the schema used in this service\"\n },\n \"view\": {\n \"type\": \"object\",\n \"properties\": {\n \"url\": {\n \"type\": \"string\",\n \"description\": \"A template to transform an entity identifier into the corresponding URI\",\n \"pattern\": \".*\\\\{\\\\{id\\\\}\\\\}.*\"\n }\n },\n \"required\": [\n \"url\"\n ]\n },\n \"defaultTypes\": {\n \"type\": \"array\",\n \"description\": \"A list of default types that are considered good generic choices for reconciliation\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n },\n \"uniqueItems\": true\n },\n \"suggest\": {\n \"type\": \"object\",\n \"description\": \"Settings for the suggest protocol, to auto-complete entities, properties and types\",\n \"definitions\": {\n \"service_definition\": {\n \"type\": \"object\",\n \"properties\": {\n \"service_url\": {\n \"type\": \"string\"\n },\n \"service_path\": {\n \"type\": \"string\"\n },\n \"flyout_service_url\": {\n \"type\": \"string\"\n },\n \"flyout_service_path\": {\n \"type\": \"string\",\n \"pattern\": \".*\\\\$\\\\{id\\\\}.*\"\n }\n },\n \"required\": []\n }\n },\n \"properties\": {\n \"entity\": {\n \"$ref\": \"#/properties/suggest/definitions/service_definition\"\n },\n \"property\": {\n \"$ref\": \"#/properties/suggest/definitions/service_definition\"\n },\n \"type\": {\n \"$ref\": \"#/properties/suggest/definitions/service_definition\"\n }\n }\n },\n \"preview\": {\n \"type\": \"object\",\n \"description\": \"Settings for the preview protocol, for HTML previews of entities\",\n \"properties\": {\n \"url\": {\n \"type\": \"string\",\n \"pattern\": \".*\\\\{\\\\{id\\\\}\\\\}.*\",\n \"description\": \"A URL pattern which transforms the entity ID into a preview URL for it\"\n },\n \"width\": {\n \"type\": \"integer\",\n \"description\": \"The width of the iframe where to include the HTML preview\"\n },\n \"height\": {\n \"type\": \"integer\",\n \"description\": \"The height of the iframe where to include the HTML preview\"\n }\n },\n \"required\": [\n \"url\",\n \"width\",\n \"height\"\n ]\n },\n \"extend\": {\n \"type\": \"object\",\n \"description\": \"Settings for the data extension protocol, to fetch property values\",\n \"properties\": {\n \"propose_properties\": {\n \"type\": \"object\",\n \"description\": \"Location of the endpoint to propose properties to fetch for a given type\",\n \"properties\": {\n \"service_url\": {\n \"type\": \"string\"\n },\n \"service_path\": {\n \"type\": \"string\"\n }\n }\n },\n \"property_settings\": {\n \"type\": \"array\",\n \"description\": \"Definition of the settings configurable by the user when fetching a property\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"Defines a numerical setting on a property\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"number\"\n ]\n },\n \"default\": {\n \"type\": \"number\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\"\n ]\n },\n {\n \"type\": \"object\",\n \"description\": \"Defines a string setting on a property\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"text\"\n ]\n },\n \"default\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\"\n ]\n },\n {\n \"type\": \"object\",\n \"description\": \"Defines a boolean setting on a property\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"checkbox\"\n ]\n },\n \"default\": {\n \"type\": \"boolean\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\"\n ]\n },\n {\n \"type\": \"object\",\n \"description\": \"Defines a setting with a fixed set of choices\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"select\"\n ]\n },\n \"default\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n },\n \"choices\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"value\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"value\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\",\n \"choices\"\n ]\n }\n ]\n }\n }\n }\n }\n },\n \"required\": [\n \"name\",\n \"identifierSpace\",\n \"schemaSpace\"\n ]\n}\n,\n\"reconciliation-query-batch\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/reconciliation-query.json\",\n \"type\": \"object\",\n \"description\": \"This schema validates the JSON serialization of any reconciliation query batch, i.e. the payload of a GET/POST to a reconciliation endpoint.\",\n \"definitions\": {\n \"property_value\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"object\",\n \"description\": \"A property value which represents another entity, for instance if it was previously reconciled itself\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n }\n ]\n }\n },\n \"patternProperties\": {\n \"^.*$\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"string\",\n \"description\": \"A string to be matched against the name of the entities\"\n },\n \"type\": {\n \"description\": \"Either a single type identifier or a list of type identifiers\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n ]\n },\n \"limit\": {\n \"type\": \"number\",\n \"description\": \"The maximum number of candidates to return\"\n },\n \"properties\": {\n \"type\": \"array\",\n \"description\": \"An optional list of property mappings to refine the query\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"pid\": {\n \"type\": \"string\",\n \"description\": \"The identifier of the property, whose values will be compared to the values supplied\"\n },\n \"v\": {\n \"description\": \"A value (or array of values) to match against the property values associated with the property on each candidate\",\n \"oneOf\": [\n {\n \"$ref\": \"#/definitions/property_value\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/property_value\"\n }\n }\n ]\n }\n },\n \"required\": [\n \"pid\",\n \"v\"\n ]\n }\n },\n \"type_strict\": {\n \"type\": \"string\",\n \"description\": \"A classification of the type matching strategy when multiple types are supplied\",\n \"enum\": [\n \"any\",\n \"should\",\n \"all\"\n ]\n }\n },\n \"required\": [\n \"query\"\n ],\n \"additionalProperties\": false\n }\n }\n}\n,\n\"reconciliation-result-batch\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/reconciliation-result-batch.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON serialization of any reconciliation result batch.\",\n \"patternProperties\": {\n \"^.*$\": {\n \"type\": \"object\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Entity identifier of the candidate\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Entity name of the candidate\"\n },\n \"score\": {\n \"type\": \"number\",\n \"description\": \"Number indicating how likely it is that the candidate matches the query\"\n },\n \"match\": {\n \"type\": \"boolean\",\n \"description\": \"Boolean value indicating whether the candiate is a certain match or not.\"\n },\n \"type\": {\n \"type\": \"array\",\n \"description\": \"Types the candidate entity belongs to\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"A type can be given by id and name\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n },\n {\n \"type\": \"string\",\n \"description\": \"Alternatively, if only a string is given, it is treated as the id\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"id\",\n \"name\",\n \"score\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n }\n }\n}\n,\n\"suggest-entities-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/suggest-entities-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON response of a suggest service for entities.\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Identifier of the suggested entity\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the suggested entity\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"An optional description which can be provided to disambiguate namesakes, providing more context.\"\n },\n \"notable\": {\n \"type\": \"array\",\n \"description\": \"Types the suggest entity belongs to\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"A type can be given by id and name\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n },\n {\n \"type\": \"string\",\n \"description\": \"Alternatively, if only a string is given, it is treated as the id\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n}\n,\n\"suggest-properties-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/suggest-properties-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON response of a suggest service for properties.\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Identifier of the suggested property\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the suggested property\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"An optional description which can be provided to disambiguate namesakes, providing more context.\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n}\n,\n\"suggest-types-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/suggest-types-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON response of a suggest service for types.\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Identifier of the suggested type\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the suggested type\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"An optional description which can be provided to disambiguate namesakes, providing more context.\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n}\n,\n},\n\"latest\": {\n\"data-extension-query\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/data-extension-query.json\",\n \"type\": \"object\",\n \"description\": \"This schema validates a data extension query\",\n \"properties\": {\n \"ids\": {\n \"type\": \"array\",\n \"description\": \"The list of entity identifiers to fetch property values from\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"properties\": {\n \"type\": \"array\",\n \"description\": \"The list of properties to fetch, with their optional configuration\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"settings\": {\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"id\"\n ]\n }\n }\n },\n \"required\": [\n \"ids\",\n \"properties\"\n ]\n}\n,\n\"data-extension-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/data-extension-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema validates a data extension response\",\n \"properties\": {\n \"meta\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n },\n \"rows\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \".*\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \".*\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"str\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"str\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"float\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"float\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"int\": {\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"int\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"date\": {\n \"type\": \"string\",\n \"description\": \"Date and time formatted in ISO format\",\n \"pattern\": \"^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\\\.[0-9]+)?(Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$\"\n }\n },\n \"required\": [\n \"date\"\n ],\n \"additionalProperties\": false\n }\n ]\n }\n }\n }\n }\n }\n }\n },\n \"required\": [\n \"rows\",\n \"meta\"\n ]\n}\n,\n\"manifest\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/manifest.json\",\n \"type\": \"object\",\n \"description\": \"This validates a service manifest, describing the features supported by the endpoint.\",\n \"properties\": {\n \"versions\": {\n \"type\": \"array\",\n \"description\": \"The list of API versions supported by this service.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"contains\": {\n \"enum\": [\"0.2\"]\n }\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"A human-readable name for the service or data source\"\n },\n \"identifierSpace\": {\n \"type\": \"string\",\n \"description\": \"A URI describing the entity identifiers used in this service\"\n },\n \"schemaSpace\": {\n \"type\": \"string\",\n \"description\": \"A URI describing the schema used in this service\"\n },\n \"view\": {\n \"type\": \"object\",\n \"properties\": {\n \"url\": {\n \"type\": \"string\",\n \"description\": \"A template to transform an entity identifier into the corresponding URI\",\n \"pattern\": \".*\\\\{\\\\{id\\\\}\\\\}.*\"\n }\n },\n \"required\": [\n \"url\"\n ]\n },\n \"feature_view\": {\n \"type\": \"object\",\n \"properties\": {\n \"url\": {\n \"type\": \"string\",\n \"description\": \"A template to transform a matching feature identifier into the corresponding URI\",\n \"pattern\": \".*\\\\{\\\\{id\\\\}\\\\}.*\"\n }\n },\n \"required\": [\n \"url\"\n ]\n },\n \"defaultTypes\": {\n \"type\": \"array\",\n \"description\": \"A list of default types that are considered good generic choices for reconciliation\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n },\n \"uniqueItems\": true\n },\n \"suggest\": {\n \"type\": \"object\",\n \"description\": \"Settings for the suggest protocol, to auto-complete entities, properties and types\",\n \"definitions\": {\n \"service_definition\": {\n \"type\": \"object\",\n \"properties\": {\n \"service_url\": {\n \"type\": \"string\"\n },\n \"service_path\": {\n \"type\": \"string\"\n },\n \"flyout_service_url\": {\n \"type\": \"string\"\n },\n \"flyout_service_path\": {\n \"type\": \"string\",\n \"pattern\": \".*\\\\$\\\\{id\\\\}.*\"\n }\n },\n \"required\": []\n }\n },\n \"properties\": {\n \"entity\": {\n \"$ref\": \"#/properties/suggest/definitions/service_definition\"\n },\n \"property\": {\n \"$ref\": \"#/properties/suggest/definitions/service_definition\"\n },\n \"type\": {\n \"$ref\": \"#/properties/suggest/definitions/service_definition\"\n }\n }\n },\n \"preview\": {\n \"type\": \"object\",\n \"description\": \"Settings for the preview protocol, for HTML previews of entities\",\n \"properties\": {\n \"url\": {\n \"type\": \"string\",\n \"pattern\": \".*\\\\{\\\\{id\\\\}\\\\}.*\",\n \"description\": \"A URL pattern which transforms the entity ID into a preview URL for it\"\n },\n \"width\": {\n \"type\": \"integer\",\n \"description\": \"The width of the iframe where to include the HTML preview\"\n },\n \"height\": {\n \"type\": \"integer\",\n \"description\": \"The height of the iframe where to include the HTML preview\"\n }\n },\n \"required\": [\n \"url\",\n \"width\",\n \"height\"\n ]\n },\n \"extend\": {\n \"type\": \"object\",\n \"description\": \"Settings for the data extension protocol, to fetch property values\",\n \"properties\": {\n \"propose_properties\": {\n \"type\": \"object\",\n \"description\": \"Location of the endpoint to propose properties to fetch for a given type\",\n \"properties\": {\n \"service_url\": {\n \"type\": \"string\"\n },\n \"service_path\": {\n \"type\": \"string\"\n }\n }\n },\n \"property_settings\": {\n \"type\": \"array\",\n \"description\": \"Definition of the settings configurable by the user when fetching a property\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"Defines a numerical setting on a property\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"number\"\n ]\n },\n \"default\": {\n \"type\": \"number\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\"\n ]\n },\n {\n \"type\": \"object\",\n \"description\": \"Defines a string setting on a property\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"text\"\n ]\n },\n \"default\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\"\n ]\n },\n {\n \"type\": \"object\",\n \"description\": \"Defines a boolean setting on a property\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"checkbox\"\n ]\n },\n \"default\": {\n \"type\": \"boolean\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\"\n ]\n },\n {\n \"type\": \"object\",\n \"description\": \"Defines a setting with a fixed set of choices\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"select\"\n ]\n },\n \"default\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n },\n \"choices\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"value\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"value\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\",\n \"choices\"\n ]\n }\n ]\n }\n }\n }\n },\n \"serverLimits\": {\n \"type\": \"object\",\n \"description\": \"Resource constraints imposed by the service on clients\",\n \"properties\": {\n\t\"batchRate\": {\n \"type\": \"integer\",\n \"description\": \"The number of reconciliation query batch requests which can safely be sent to this service per second per IP address.\"\n\t},\n\t\"maxConnections\": {\n \"type\": \"integer\",\n \"description\": \"The number of TCP connections which can be concurrently kept open from a single IP address.\"\n\t}\n }\n }\n },\n \"required\": [\n \"versions\",\n \"name\",\n \"identifierSpace\",\n \"schemaSpace\"\n ]\n}\n,\n\"reconciliation-query-batch\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/reconciliation-query.json\",\n \"type\": \"object\",\n \"description\": \"This schema validates the JSON serialization of any reconciliation query batch, i.e. the payload of a GET/POST to a reconciliation endpoint.\",\n \"definitions\": {\n \"property_value\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"object\",\n \"description\": \"A property value which represents another entity, for instance if it was previously reconciled itself\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n }\n ]\n }\n },\n \"patternProperties\": {\n \"^.*$\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"string\",\n \"description\": \"A string to be matched against the name of the entities\"\n },\n \"type\": {\n \"description\": \"Either a single type identifier or a list of type identifiers\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n ]\n },\n \"limit\": {\n \"type\": \"number\",\n \"description\": \"The maximum number of candidates to return\"\n },\n \"properties\": {\n \"type\": \"array\",\n \"description\": \"An optional list of property mappings to refine the query\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"pid\": {\n \"type\": \"string\",\n \"description\": \"The identifier of the property, whose values will be compared to the values supplied\"\n },\n \"v\": {\n \"description\": \"A value (or array of values) to match against the property values associated with the property on each candidate\",\n \"oneOf\": [\n {\n \"$ref\": \"#/definitions/property_value\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/property_value\"\n }\n }\n ]\n }\n },\n \"required\": [\n \"pid\",\n \"v\"\n ]\n }\n },\n \"type_strict\": {\n \"type\": \"string\",\n \"description\": \"A classification of the type matching strategy when multiple types are supplied\",\n \"enum\": [\n \"any\",\n \"should\",\n \"all\"\n ]\n }\n },\n \"required\": [\n \"query\"\n ],\n \"additionalProperties\": false\n }\n }\n}\n,\n\"reconciliation-result-batch\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/reconciliation-result-batch.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON serialization of any reconciliation result batch.\",\n \"patternProperties\": {\n \"^.*$\": {\n \"type\": \"object\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Entity identifier of the candidate\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Entity name of the candidate\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"Optional description of the candidate entity\"\n },\n \"score\": {\n \"type\": \"number\",\n \"description\": \"Number indicating how likely it is that the candidate matches the query\"\n },\n \"features\": {\n \"type\": \"array\",\n \"description\": \"A list of features which can be used to derive a matching score\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"A unique string identifier for the feature\"\n },\n \"value\": {\n \"description\": \"The value of the feature for this reconciliation candidate\",\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"number\"\n }\n ]\n }\n }\n }\n },\n \"match\": {\n \"type\": \"boolean\",\n \"description\": \"Boolean value indicating whether the candiate is a certain match or not.\"\n },\n \"type\": {\n \"type\": \"array\",\n \"description\": \"Types the candidate entity belongs to\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"A type can be given by id and name\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n },\n {\n \"type\": \"string\",\n \"description\": \"Alternatively, if only a string is given, it is treated as the id\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"id\",\n \"name\",\n \"score\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n }\n }\n}\n,\n\"suggest-entities-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/suggest-entities-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON response of a suggest service for entities.\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Identifier of the suggested entity\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the suggested entity\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"An optional description which can be provided to disambiguate namesakes, providing more context.\"\n },\n \"notable\": {\n \"type\": \"array\",\n \"description\": \"Types the suggest entity belongs to\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"A type can be given by id and name\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n },\n {\n \"type\": \"string\",\n \"description\": \"Alternatively, if only a string is given, it is treated as the id\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n}\n,\n\"suggest-properties-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/suggest-properties-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON response of a suggest service for properties.\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Identifier of the suggested property\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the suggested property\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"An optional description which can be provided to disambiguate namesakes, providing more context.\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n}\n,\n\"suggest-types-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/suggest-types-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON response of a suggest service for types.\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Identifier of the suggested type\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the suggested type\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"An optional description which can be provided to disambiguate namesakes, providing more context.\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n}\n,\n},\n};\n","\nimport { fetchJsonpParams, fetchParams } from './utils.js';\nimport { specVersions } from './JsonSchemas.js';\nimport { getSchema } from './JsonValidator.js';\n\nexport default class ReconciliationService {\n constructor(endpoint, manifest, cors) {\n this.endpoint = endpoint;\n this.manifest = manifest;\n this.cors = cors;\n\n // test the service's manifest against manifest schemas\n // for all known versions of the specs, in order.\n this.latestCompatibleVersion = null;\n for (var version of specVersions) {\n\t let schema = getSchema(version, 'manifest');\n\t let valid = schema(manifest);\n\t if (valid) {\n\t\tthis.latestCompatibleVersion = version;\n }\n }\n }\n\n getFetcher() {\n return this.cors ? fetchParams : fetchJsonpParams;\n }\n}\n\n\n","\nimport React from 'react';\nimport Button from 'react-bootstrap/lib/Button';\nimport FeatureCell from './FeatureCell.js';\nimport fetchJsonp from 'fetch-jsonp';\nimport ReconciliationService from './ReconciliationService.js';\n\nexport default class FeatureRow extends React.Component {\n constructor() {\n super();\n this.state = {\n reacheableCORS: 'checking',\n reacheableJSONP: 'maybe',\n manifest: {},\n }; \n }\n\n componentDidMount() {\n fetch(this.props.endpoint, { timeout: 5000 })\n .then(response => response.json())\n .then(response => this.setState({manifest: response, reacheableCORS: true}))\n .catch(error => {\n this.setState({reacheableCORS: false});\n });\n if (this.props.jsonp) {\n this.checkJsonp();\n }\n }\n\n checkJsonp = () => {\n this.setState({reacheableJSONP: 'checking'});\n fetchJsonp(this.props.endpoint)\n .then(response => response.json())\n .then(response => this.setState({manifest: response, reacheableJSONP: true}))\n .catch(error => this.setState({reacheableJSONP: false}));\n }\n\n suggestSettings() {\n return this.state.manifest.suggest || {};\n }\n\n get isReacheable() {\n return this.state.reacheableCORS === true || this.state.reacheableJSONP === true;\n }\n \n hasView() {\n if (!this.isReacheable)\n return null;\n return 'url' in (this.state.manifest.view || {});\n }\n\n hasSuggestEntity() {\n if (!this.isReacheable)\n return null;\n return 'entity' in this.suggestSettings();\n }\n\n hasSuggestProperty() {\n if (!this.isReacheable)\n return null;\n return 'property' in this.suggestSettings();\n }\n\n hasSuggestType() {\n if (!this.isReacheable)\n return null;\n return 'type' in this.suggestSettings();\n }\n\n hasPreview() {\n if (!this.isReacheable)\n return null;\n return 'preview' in this.state.manifest;\n }\n\n hasExtend() {\n if (!this.isReacheable)\n return null;\n return 'extend' in this.state.manifest;\n }\n\n reconciliationService() {\n return new ReconciliationService(this.props.endpoint, this.state.manifest, this.state.reacheableCORS);\n }\n\n nameCell() {\n let parts = [\n {this.props.name}\n ];\n if (this.props.documentation && !this.props.source_url) {\n parts.push( (docs));\n }\n if (this.props.documentation && this.props.source_url) {\n parts.push( (docs, source));\n }\n if (!this.props.documentation && this.props.source_url) {\n parts.push( (source));\n }\n if (this.props.wd_uri) {\n parts.push(\n \n \n \n );\n }\n return parts;\n }\n\n triggerOnSelect = () => {\n if (this.props.onSelect) {\n this.props.onSelect(this.reconciliationService());\n }\n }\n\n render() {\n return (\n \n {this.nameCell()}\n {' '}{this.props.endpoint}\n\t {this.reconciliationService().latestCompatibleVersion || '?'}\n \n \n \n \n \n \n \n \n );\n }\n}\n\n","import React from 'react';\nimport Table from 'react-bootstrap/lib/Table';\nimport Modal from 'react-bootstrap/lib/Modal';\nimport Button from 'react-bootstrap/lib/Button';\nimport FeatureRow from './FeatureRow.js';\n\nclass Row {\n constructor(endpoint, name, documentation, source_url, wd_uri) {\n this.endpoint = endpoint;\n this.name = name;\n this.documentation = documentation;\n this.source_url = source_url;\n this.wd_uri = wd_uri;\n this.jsonp = false;\n }\n\n useJsonp() {\n this.jsonp = true;\n }\n}\n\n\nexport default class FeatureTable extends React.Component {\n constructor() {\n super();\n this.state = {\n services: [],\n showAddServiceDialog: false,\n refreshing: false,\n };\n\n this.sparql_query = (\n \"SELECT ?service ?serviceLabel ?endpoint ?documentation ?source WHERE {\\n\" +\n \" ?service p:P6269 ?statement.\\n\"+\n \" ?statement ps:P6269 ?endpoint ;\\n\"+\n \" pq:P2700 wd:Q64490175.\\n\"+\n \" OPTIONAL { ?statement (pq:P973 | pq:P2078) ?documentation }\\n\" +\n \" OPTIONAL { ?statement pq:P1324 ?source }\\n\" +\n \" FILTER NOT EXISTS { ?statement wikibase:rank wikibase:DeprecatedRank }\\n\" +\n \" SERVICE wikibase:label { bd:serviceParam wikibase:language \\\"[AUTO_LANGUAGE],en\\\". }\\n\" +\n \"}\\n\" +\n \"ORDER BY DESC(?endpoint)\\n\");\n }\n\n refreshServicesFromWD = (method) => {\n this.setState({\n refreshing: true\n });\n let url = new URL(\"https://query.wikidata.org/sparql\");\n let params = {query:this.sparql_query, format: 'json'};\n let promise = null;\n if (method === 'GET') {\n Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));\n promise = fetch(url);\n } else {\n var urlParams = new URLSearchParams();\n Object.keys(params).forEach(key => urlParams.append(key, params[key]));\n promise = fetch(url, {\n method: 'POST',\n mode: 'cors',\n cache: 'no-cache',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: urlParams,\n });\n }\n\n promise\n .then(result => result.json())\n .then(result =>\n this.setState({\n services: result.results.bindings.map(entry =>\n new Row(entry.endpoint.value, entry.serviceLabel.value,\n 'documentation' in entry ? entry.documentation.value : undefined,\n 'source' in entry ? entry.source.value : undefined,\n entry.service.value)),\n refreshing: false\n })\n )\n .catch(error => {\n console.log(error);\n this.setState({ refreshing: false });\n });\n }\n\n componentDidMount() {\n this.refreshServicesFromWD('GET');\n }\n\n loadAllJsonp = () => {\n this.setState({\n services: this.state.services.map(row => { row.useJsonp(); return row })\n });\n }\n\n openAddServiceDialog = () => {\n this.setState({\n showAddServiceDialog: true\n });\n }\n\n closeAddServiceDialog = () => {\n this.setState({\n showAddServiceDialog: false\n });\n }\n\n get sparqlQueryUrl() {\n return 'https://query.wikidata.org/#'+encodeURIComponent(this.sparql_query);\n }\n\n render() {\n return (\n <>\n

Due to a security risk inherent to JSONP, only endpoints supporting CORS are loaded by default. You can click the{' '}\n button in each row to attempt to load the service via JSONP.\n Note that a malicious endpoint could use JSONP to execute arbitrary JavaScript code in this page. If you trust all the reconciliation services listed here, you can also .\n

\n \n \n \n \n \n\t \n \n \n \n \n \n \n \n \n \n \n \n {this.state.services.map(\n row => )\n }\n \n
NameEndpointAPI versionCORSJSONPView entitiesSuggest entitiesSuggest typesSuggest propertiesPreview entitiesExtend data
\n    \n \n\n \n \n How to add a service to this list\n \n \n

\n This list is generated by a SPARQL query on Wikidata.\n To add your service to it, follow these steps:\n

\n \n
\n
\n \n );\n }\n}\n","import React from 'react';\nimport { Link, useRouteMatch } from 'react-router-dom';\n\nexport default function TabLink({ to, title, exact }) {\n const isActive = useRouteMatch({path: to, exact: exact});\n const className = isActive ? 'active' : '';\n\n return (\n
  • \n \n {title}\n \n
  • );\n}\n\n","\nimport React from 'react';\nimport Form from 'react-bootstrap/lib/Form';\nimport FormGroup from 'react-bootstrap/lib/FormGroup';\nimport FormControl from 'react-bootstrap/lib/FormControl';\nimport ControlLabel from 'react-bootstrap/lib/ControlLabel';\nimport HelpBlock from 'react-bootstrap/lib/HelpBlock';\nimport Col from 'react-bootstrap/lib/Col';\nimport fetchJsonp from 'fetch-jsonp';\nimport ReconciliationService from './ReconciliationService.js';\n\nexport default class ReconciliationServiceInput extends React.Component {\n\n state = {\n service: this.props.initialService\n };\n\n componentWillMount() {\n this.timer = null;\n }\n\n componentDidMount() {\n console.log('hey do we need to validate');\n console.log(this.props.initialService);\n if (this.props.initialService.endpoint && !this.props.initialService.manifest) {\n console.log('validating endpoint at start');\n this.validateEndpoint();\n }\n }\n\n setService(service) {\n this.setState({\n\tservice: service\n });\n }\n\n handleChange(e) {\n clearTimeout(this.timer);\n\n this.setState({\n\tservice: new ReconciliationService(e.target.value, undefined, undefined),\n error: undefined\n });\n \n this.timer = setTimeout(() => this.validateEndpoint(), 1000);\n }\n\n validateEndpoint() {\n let endpoint = this.state.service.endpoint;\n fetch(endpoint)\n .then(result => result.json())\n .then(result => this._setService(endpoint, result, true))\n .catch(e =>\n\t fetchJsonp(endpoint)\n\t .then(result => result.json())\n\t .then(result => this._setService(endpoint, result, false))\n\t .catch(e => this._setError(endpoint, e)));\n }\n\n _setService(endpoint, manifest, cors) {\n if(this.state.service.endpoint === endpoint) {\n\tlet service = new ReconciliationService(endpoint, manifest, cors);\n this.setState({\n\t service: service \n });\n if(this.props.onChange !== undefined) {\n this.props.onChange(service);\n }\n }\n }\n\n _setError(endpoint, error) {\n if(this.state.service.endpoint === endpoint) {\n this.setState({manifest: undefined, error: error})\n if(this.props.onChange !== undefined) {\n this.props.onChange(undefined, undefined);\n }\n }\n }\n \n getValidationState() {\n if (this.state.service !== undefined && this.state.service.manifest !== undefined) {\n return 'success';\n } else if(this.state.error !== undefined) {\n return 'error';\n }\n return null;\n }\n\n getMessage() {\n let message = '';\n if (this.getValidationState() === 'error') {\n message = 'The endpoint MUST return a JSON document describing the service, accessible vîa CORS or JSONP.';\n let endpoint = this.state.service.endpoint;\n if (endpoint !== undefined && (\n endpoint.startsWith('http://')\n && !endpoint.startsWith('http://localhost')\n && !endpoint.startsWith('http://127.0.0.1'))) {\n message += ' The endpoint SHOULD be available over HTTPS. Depending on your browser, this test bench might not be able to test reconciliation services over HTTP.';\n }\n return message;\n }\n }\n\n handleSubmit(e) {\n clearTimeout(this.timer);\n this.validateEndpoint();\n e.preventDefault();\n }\n\n render() {\n return (\n
    this.handleSubmit(e)}>\n \n Endpoint:\n \n this.handleChange(e)}/>\n \n {this.getMessage()}\n \n \n
    \n );\n }\n}\n","import React from 'react';\nimport {AsyncTypeahead} from 'react-bootstrap-typeahead';\n\nexport default class ReconcileSuggest extends React.Component {\n constructor() {\n super();\n this.state = {\n value: undefined,\n suggestions: [],\n isLoading: false,\n };\n }\n\n getValue() {\n if (this.props.onChange !== undefined) {\n return this.props.value;\n } else {\n return this.state.value;\n }\n }\n\n get manifest() {\n if (!this.props.service) {\n\t return null;\n } else {\n\t return this.props.service.manifest;\n }\n }\n\n getUrl() {\n if (!this.manifest || !this.manifest.suggest) {\n return null;\n }\n let configuration = this.manifest.suggest[this.props.entityClass];\n if (!configuration) {\n return null;\n }\n return configuration.service_url + configuration.service_path;\n }\n\n onSuggestionsFetchRequested = (value) => {\n let url = this.getUrl();\n let params = {'prefix':value};\n if (url === null) {\n return;\n }\n this.setState({isLoading: true});\n let fetcher = this.props.service.getFetcher();\n fetcher(url, params)\n .then(result => result.json())\n .then(result => {\n this.setState({suggestions: result.result, isLoading: false})})\n .catch(e => {\n console.log(e);\n this.setState({isLoading: false});\n });\n };\n\n onSuggestionsClearRequested = () => {\n this.setState({suggestions:[]});\n };\n\n onChange = (newValue) => {\n if (this.props.onChange === undefined) {\n this.setState({\n value: newValue[0]\n });\n } else {\n this.props.onChange(newValue[0]);\n }\n };\n\n render() {\n return (\n true}\n selected={this.getValue() ? [this.getValue()] : []}\n onChange={this.onChange}\n renderMenuItemChildren={(option, props, index) => \n <>\n {option.id}\n {Array.isArray(option.broader) && option.broader.length && {option.broader.map(e => e.id).join(', ')} > }\n {option.name}
    \n {option.description}\n \n }\n />\n );\n }\n}\n\n","import React from 'react';\nimport Button from 'react-bootstrap/lib/Button';\nimport InputGroup from 'react-bootstrap/lib/InputGroup';\nimport FormControl from 'react-bootstrap/lib/FormControl';\nimport ReconcileSuggest from './ReconcileSuggest.js';\n\n/**\n * An input which can either have autocompletion enabled\n * (thanks to a suggest service) or be a simple,\n * blank input (without autocompletion) if that is not\n * available from the service.\n */\nexport default class GenericInput extends React.Component {\n constructor() {\n super();\n this.state = {\n value: undefined\n }\n }\n\n getValue() {\n if (this.props.onChange !== undefined) {\n return this.props.value;\n } else {\n return this.state.value;\n }\n }\n\n get manifest() {\n if (!this.props.service) {\n return null;\n } else {\n return this.props.service.manifest;\n }\n }\n\n get placeholder() {\n return this.props.entityClass + ' id'\n }\n\n get currentValue() {\n if (this.props.onChange === undefined) {\n return this.state.value;\n } else {\n return this.props.value || this.state.value;\n }\n }\n\n get currentId() {\n let val = this.currentValue;\n return val === undefined ? undefined : val.id;\n }\n\n get hasAutocomplete() {\n return (this.manifest && this.manifest.suggest && this.manifest.suggest[this.props.entityClass]);\n }\n\n onSuggestChange = (newValue) => {\n this.setState({ value: newValue });\n if (this.props.onChange !== undefined) {\n this.props.onChange(newValue);\n }\n }\n\n onIdChange = (e) => {\n let newValue = {\n id: e.currentTarget.value,\n name: e.currentTarget.value\n };\n if (this.props.onChange === undefined) {\n this.setState({ value: newValue });\n } else if (this.props.explicitSubmit === undefined) {\n this.props.onChange(newValue);\n } else {\n this.setState({ value: newValue });\n }\n } \n\n onSubmit = (e) => {\n this.props.onChange(this.state.value);\n e.preventDefault();\n }\n\n render() {\n return (this.hasAutocomplete ?\n ()\n : (\n (this.props.explicitSubmit !== undefined ?\n \n \n \n \n \n \n : \n \n\n )\n ));\n }\n}\n","\nimport React from 'react';\nimport FormControl from 'react-bootstrap/lib/FormControl';\nimport Button from 'react-bootstrap/lib/Button';\nimport GenericInput from './GenericInput.js';\n\nexport default class PropertyMapping extends React.Component {\n\n newMapping = () => {\n this.emitChange(\n this.props.value.concat([{\n property: undefined,\n value: '',\n }])\n );\n }\n\n deleteMapping = (idx) => {\n let newArray = this.props.value.slice();\n newArray.splice(idx, 1);\n this.emitChange(newArray);\n }\n\n onValueChange = (idx, e) => {\n let newArray = this.props.value.slice();\n let {property} = newArray[idx];\n newArray[idx] = {property, value: e.currentTarget.value};\n this.emitChange(newArray);\n }\n\n onPropertyChange = (idx, propertyValue) => {\n console.log('new property value');\n console.log(idx);\n console.log(propertyValue);\n let newArray = this.props.value.slice();\n let {value} = newArray[idx];\n newArray[idx] = {property:propertyValue, value};\n console.log(newArray);\n this.emitChange(newArray);\n }\n\n emitChange(newValue) {\n if (this.props.onChange) {\n this.props.onChange(newValue);\n }\n }\n\n renderMappings() {\n return this.props.value.map((mapping, idx) =>\n
    \n
    \n this.onPropertyChange(idx, v)} />\n
    \n
    \n this.onValueChange(idx, e)} />
    \n \n
    \n );\n }\n\n render() {\n return (\n
    \n {this.renderMappings()}
    \n \n
    \n );\n }\n}\n","\nimport React from 'react';\nimport Badge from 'react-bootstrap/lib/Badge';\nimport ListGroupItem from 'react-bootstrap/lib/ListGroupItem';\n\nexport default class Candidate extends React.Component {\n\n get url() {\n let view = null;\n let manifest = this.props.manifest;\n if ('view' in manifest && 'url' in this.props.manifest.view && 'id' in this.props.candidate) {\n view = this.props.manifest.view.url.replace('{{id}}', this.props.candidate.id);\n }\n return view;\n }\n\n renderDescription() {\n let description = this.props.candidate.description;\n if (description !== undefined) {\n return (
    Description
    {description}
    );\n }\n }\n\n renderTypes() {\n let types = this.props.candidate.type;\n if (types !== undefined) {\n return (
    Types
    \n {types.map((type, idx) => [\n idx > 0 && \", \",\n type.name + ' (' + type.id + ')'\n ])}\n
    );\n }\n }\n\n renderFeatures() {\n let features = this.props.candidate.features;\n if (features !== undefined) {\n return (
    \n {features.map((feature, idx) => \n (
    Feature {feature.id}
    {feature.value}
    )\n )}\n
    );\n }\n }\n\n render() {\n let candidate = this.props.candidate;\n return (\n {this.props.candidate.score}\n
    \n \n {this.renderDescription()}\n {this.renderTypes()}\n {this.renderFeatures()}\n
    \n
    );\n }\n}\n","import React from 'react';\n\nexport default class PreviewRenderer extends React.Component {\n iframe = function() {\n const iframeUrl = this.props.settings.url.replace('{{id}}', encodeURIComponent(this.props.id));\n if (!Number.isInteger(this.props.settings.height) || !Number.isInteger(this.props.settings.width)) {\n return {__html:`

    The manifest must provide the width and height of the preview iframe as integers.

    `};\n }\n try {\n new URL(iframeUrl);\n // we have a valid URL\n return {__html:``};\n } catch(_) {\n return {__html:`

    Invalid URL generated by the preview service URL template.

    `};\n }\n }\n\n render() {\n return (\n
    \n {(this.props.id === undefined ?\n
    :\n
    \n )}\n
    \n );\n }\n}\n\n","\n\nimport React from 'react';\nimport ListGroupItem from 'react-bootstrap/lib/ListGroupItem';\n\n/**\n * Renders a value returned by a data extension service\n * to a list item.\n */\nexport default class DataExtensionValue extends React.Component {\n\n get renderedValue() {\n const val = this.props.value;\n if (val.date !== undefined) {\n return val.date;\n } else if (val.id !== undefined && val.name !== undefined) {\n return val.name;\n } else if (val.str !== undefined) {\n return val.str;\n } else if (val.float !== undefined) {\n return val.float;\n } else if (val.int !== undefined) {\n return val.int;\n } else {\n return 'Singleton';\n }\n }\n\n get datatype() {\n const val = this.props.value;\n if (val.date !== undefined) {\n return 'date';\n } else if (val.id !== undefined && val.name !== undefined) {\n return val.id;\n } else if (val.str !== undefined) {\n return 'string';\n } else if (val.float !== undefined) {\n return 'floating-point number';\n } else if (val.int !== undefined) {\n return 'integer';\n } else {\n return 'empty';\n }\n }\n\n render() {\n return (\n {this.datatype}\n );\n }\n}\n","import React from 'react';\nimport Form from 'react-bootstrap/lib/Form';\nimport FormGroup from 'react-bootstrap/lib/FormGroup';\nimport InputGroup from 'react-bootstrap/lib/InputGroup';\nimport Button from 'react-bootstrap/lib/Button';\nimport Col from 'react-bootstrap/lib/Col';\nimport ControlLabel from 'react-bootstrap/lib/ControlLabel';\nimport ListGroup from 'react-bootstrap/lib/ListGroup';\nimport GenericInput from './GenericInput.js';\nimport DataExtensionValue from './DataExtensionValue.js';\nimport JSONTree from 'react-json-tree';\nimport {jsonTheme} from './utils.js';\nimport { getSchema } from './JsonValidator.js';\n\nexport default class DataExtensionTab extends React.Component {\n\n constructor() {\n super();\n this.state = {\n entity: undefined,\n property: undefined,\n extendResults: undefined,\n validationErrors: []\n };\n }\n\n onEntityChange = (newValue) => {\n this.setState({\n entity: newValue,\n extendResults: undefined,\n validationErrors: []\n });\n }\n\n onPropertyChange = (newValue) => {\n this.setState({\n property: newValue,\n extendResults: undefined,\n validationErrors: []\n });\n }\n\n formulateQuery() {\n if (this.state.entity !== undefined && this.state.property !== undefined) {\n return {\n ids: [this.state.entity.id],\n properties: [{id: this.state.property.id}]\n };\n } else {\n return {};\n }\n }\n\n formulateQueryUrl() {\n let baseUrl = this.props.service.endpoint;\n if (!baseUrl) {\n return '#';\n }\n let params = {\n extend: JSON.stringify(this.formulateQuery())\n };\n let url = new URL(baseUrl);\n Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));\n return url.toString();\n }\n\n resetQuery = (e) => {\n e.preventDefault();\n this.setState({\n entity: undefined,\n property: undefined,\n extendResults: undefined,\n validationErrors: undefined\n });\n }\n\n submitQuery = (e) => {\n e.preventDefault();\n this.setState({extendResults: 'fetching'});\n let fetcher = this.props.service.getFetcher();\n fetcher(this.formulateQueryUrl(), {timeout: 20000})\n .then(result => result.json())\n .then(result =>\n this.setState({\n extendResults: result,\n validationErrors: this.validateServiceResponse(result)\n })\n )\n .catch(e => {\n this.setState({\n exdentResults: 'failed',\n extendError: e.message\n });\n });\n }\n\n renderResponseValidationErrors() {\n return
    ;\n }\n\n renderQueryResults() {\n if (this.state.extendResults === 'fetching') {\n return (
    Querying the service...
    );\n } else if (this.state.extendResults === 'failed') {\n return (
    Error: {this.state.extendError}
    );\n } else if (this.state.extendResults === undefined || this.state.entity === undefined || this.state.property === undefined) {\n return (
    );\n } else {\n if (this.state.extendResults.rows === undefined) {\n return (No rows attribute in the response.);\n }\n if (this.state.extendResults.rows[this.state.entity.id] === undefined) {\n return (Missing rows.{this.state.entity.id} object in the response.);\n }\n if (this.state.extendResults.rows[this.state.entity.id][this.state.property.id] === undefined) {\n return (Missing rows.{this.state.entity.id}{this.state.property.id} object in the response.);\n }\n const values = this.state.extendResults.rows[this.state.entity.id][this.state.property.id];\n if (values.length === 0) {\n return (No results);\n }\n return (\n \n {values.map((value, idx) =>\n )}\n );\n }\n }\n\n validateServiceResponse(response) {\n\tlet schema = getSchema(this.props.service.latestCompatibleVersion, 'data-extension-response'); \n let valid = schema(response);\n if (!valid) {\n return schema.errors.map(error => error.dataPath+' '+error.message);\n } else {\n return [];\n }\n }\n\n render() {\n return (\n
    \n \n
    \n \n Entity:\n \n \n \n \n \n Property:\n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n \n \n ''}\n shouldExpandNode={(keyName, data, level) => true}\n hideRoot={true} />\n
    \n View query results on the service\n {this.renderResponseValidationErrors()}\n \n \n {this.renderQueryResults()}\n \n\n
    \n );\n }\n}\n\n","import React from 'react';\nimport Alert from 'react-bootstrap/lib/Alert';\nimport Tabs from 'react-bootstrap/lib/Tabs';\nimport Tab from 'react-bootstrap/lib/Tab';\nimport Form from 'react-bootstrap/lib/Form';\nimport FormGroup from 'react-bootstrap/lib/FormGroup';\nimport InputGroup from 'react-bootstrap/lib/InputGroup';\nimport FormControl from 'react-bootstrap/lib/FormControl';\nimport Radio from 'react-bootstrap/lib/Radio';\nimport Button from 'react-bootstrap/lib/Button';\nimport Col from 'react-bootstrap/lib/Col';\nimport ControlLabel from 'react-bootstrap/lib/ControlLabel';\nimport ListGroup from 'react-bootstrap/lib/ListGroup';\nimport ReconcileSuggest from './ReconcileSuggest.js';\nimport PropertyMapping from './PropertyMapping.js';\nimport Candidate from './Candidate.js';\nimport GenericInput from './GenericInput.js';\nimport PreviewRenderer from './PreviewRenderer.js';\nimport DataExtensionTab from './DataExtensionTab.js';\nimport JSONTree from 'react-json-tree';\nimport { getSchema } from './JsonValidator.js';\nimport { jsonTheme } from './utils.js';\n\nexport default class TestBench extends React.Component {\n constructor() {\n super();\n\n this.state = {\n reconQuery: '',\n reconType: 'no-type',\n reconCustomType: undefined,\n reconProperties: [],\n reconLimit: undefined,\n reconResponseValidationErrors: [],\n previewEntityId : undefined\n };\n }\n\n onReconQueryChange = (e) => {\n this.setState({\n reconQuery: e.currentTarget.value\n });\n }\n\n onReconTypeChange = (e) => {\n this.setState({\n reconType: e.currentTarget.value\n });\n }\n\n onCustomTypeChange = (v) => {\n this.setState({\n reconCustomType: v\n });\n }\n\n onReconPropertiesChange = (values) => {\n this.setState({\n reconProperties: values\n });\n }\n\n onReconLimitChange = (e) => {\n this.setState({\n reconLimit: e.currentTarget.value\n });\n }\n\n onPreviewEntityChange = (value) => {\n this.setState({\n previewEntityId: value !== undefined ? value.id : undefined\n });\n };\n\n get defaultTypes() {\n if (this.props.service && this.props.service.manifest) {\n return this.props.service.manifest.defaultTypes || [];\n } else {\n return [];\n }\n }\n\n get hasTypeSuggest() {\n return (this.props.service &&\n\t this.props.service.manifest &&\n\t this.props.service.manifest.suggest &&\n\t this.props.service.manifest.suggest.type);\n }\n\n get hasPropertySuggest() {\n return (this.props.service &&\n\t this.props.service.manifest &&\n\t this.props.service.manifest.suggest &&\n\t this.props.service.manifest.suggest.property);\n }\n\n get hasPreviewService() {\n return (this.props.service &&\n this.props.service.manifest &&\n this.props.service.manifest.preview);\n } \n\n get hasDataExtension() {\n return (this.props.service &&\n this.props.service.manifest &&\n this.props.service.manifest.extend);\n }\n\n onSubmitReconciliation = (e) => {\n e.preventDefault();\n if (!this.props.service || !this.props.service.endpoint) {\n return;\n }\n this.setState({reconResults: 'fetching'});\n let fetcher = this.props.service.getFetcher();\n fetcher(this.formulateQueryUrl(), {timeout: 20000})\n .then(result => result.json())\n .then(result =>\n this.setState({\n reconResults: result.q0.result,\n reconResponseValidationErrors: this.validateServiceResponse('reconciliation-result-batch', result)\n }))\n .catch(e => {\n this.setState({\n reconError: e.message,\n reconResults: 'failed',\n })});\n }\n\n validateServiceResponse(schemaName, response) {\n let schema = getSchema(this.props.service.latestCompatibleVersion, schemaName);\n let valid = schema(response);\n if (!valid) {\n return schema.errors.map(error => error.dataPath+' '+error.message);\n } else {\n return [];\n }\n }\n\n renderQueryResults() {\n if (this.state.reconResults === 'fetching') {\n return (
    Querying the service...
    );\n } else if (this.state.reconResults === 'failed') {\n return (
    Error: {this.state.reconError}
    );\n } else if (this.state.reconResults === undefined) {\n return (
    );\n } else {\n if (this.state.reconResults.length === 0) {\n return (No results);\n }\n return (\n \n {this.state.reconResults.map(result =>\n \n )}\n \n );\n }\n }\n\n renderReconResponseValidationErrors() {\n if (this.state.reconResponseValidationErrors.length === 0) {\n return (
    );\n } else {\n return (\n Validations error for reconcilation response\n
      \n {this.state.reconResponseValidationErrors.map((error, idx) => \n
    • {error}
    • \n )}\n
    \n
    );\n }\n }\n\n renderManifestValidationErrors() {\n let manifest = this.props.service.manifest;\n let errors = this.validateServiceResponse('manifest', manifest);\n if (errors.length === 0) {\n return (
    );\n } else {\n return (\n Validation errors for service manifest\n
      \n {errors.map((error, idx) =>\n (
    • {error}
    • ))}\n
    \n
    );\n }\n }\n\n formulateReconQuery() {\n let query = {\n query: this.state.reconQuery,\n };\n if (this.state.reconType === 'custom-type' && this.state.reconCustomType !== undefined) {\n query.type = this.state.reconCustomType.id;\n } else if (this.state.reconType !== 'no-type') {\n query.type = this.state.reconType;\n }\n if (this.state.reconProperties.length > 0) {\n query.properties = this.state.reconProperties\n .filter(m => m !== undefined && m.property && m.value)\n .map(m => {return {pid: m.property.id, v: m.value}})\n }\n if (!isNaN(parseInt(this.state.reconLimit))) {\n query.limit = parseInt(this.state.reconLimit);\n }\n return query;\n }\n\n formulateQueryUrl() {\n let baseUrl = this.props.service.endpoint;\n if (!baseUrl) {\n return '#';\n }\n let params = {\n queries: JSON.stringify({q0: this.formulateReconQuery()})\n };\n let url = new URL(baseUrl);\n Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));\n return url.toString();\n }\n\n renderTypeChoices() {\n let current = this.state.reconType;\n let choices = this.defaultTypes.map(t =>\n \n {t.name}
    \n {Array.isArray(t.broader) && t.broader.length && {t.broader.map(e => e.id).join(', ')} > }{t.id}\n \n );\n if (this.hasTypeSuggest) {\n choices.push(\n Custom:\n
    \n \n
    \n );\n }\n choices.push(Reconcile against no particular type);\n return choices;\n }\n\n render() {\n return (\n
    \n {this.renderManifestValidationErrors()}\n \n \n
    \n \n
    \n \n Name:\n \n \n \n \n \n \n \n \n Type:\n \n {this.renderTypeChoices()}\n \n \n \n Properties:\n \n \n \n \n \n Limit:\n \n this.onReconLimitChange(v)} />\n \n \n
    \n \n \n ''}\n shouldExpandNode={(keyName, data, level) => true}\n hideRoot={true} />\n
    \n View query results on the service\n {this.renderReconResponseValidationErrors()}\n \n \n {this.renderQueryResults()}\n \n
    \n
    \n \n
    \n
    \n \n Entity:\n \n \n \n \n \n Type:\n \n \n \n \n \n Property:\n \n \n \n \n
    \n
    \n
    \n \n
    \n {(this.hasPreviewService ?\n
    \n
    \n \n Entity:\n \n \n \n \n
    \n \n
    \n :

    Previewing is not supported by the service.

    )}\n
    \n
    \n \n
    \n {(this.hasDataExtension ?\n \n :

    Data extension is not supported by the service.

    )}\n
    \n
    \n
    \n
    \n );\n }\n}\n","import React from 'react';\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport './style.css';\nimport FeatureTable from './FeatureTable.js';\nimport FeatureRow from './FeatureRow.js';\nimport TabLink from './TabLink.js';\nimport ReconciliationServiceInput from './ReconciliationServiceInput.js';\nimport TestBench from './TestBench.js';\nimport { HashRouter, Switch, Route, useParams, useHistory } from \"react-router-dom\";\n\n\nfunction TestbenchTab({ servicesMap, onEndpointChange }) {\n\n var { endpoint } = useParams();\n endpoint = endpoint ? decodeURIComponent(endpoint) : undefined;\n let service = servicesMap[endpoint];\n let testBench =
    ;\n if (endpoint && service) {\n testBench = ();\n }\n\n let history = useHistory();\n let handleChange = function (service) {\n onEndpointChange(service);\n if (service) {\n history.push(`/client/${encodeURIComponent(service.endpoint)}`);\n }\n };\n\n return (\n
    \n

    This form lets you test a reconciliation endpoint interactively.

    \n \n {testBench}\n
    );\n}\n\nfunction TableTab({ onEndpointSelect, style }) {\n\n let history = useHistory();\n \n let handleSelect = function (service) {\n onEndpointSelect(service);\n history.push(`/client/${encodeURIComponent(service.endpoint)}`);\n };\n\n return (
    \n

    This table lists reconciliation services known to Wikidata and\n indicates which features of the reconciliation API they support.\n See also our census which lists client and server software that use the API.\n

    \n

    If you are viewing this app over HTTPS it is likely that reconciliation services using HTTP are blocked as \"mixed content\". You can disable this protection in your browser to load HTTP reconciliation services.

    \n \n \n \n
    );\n}\n\nexport default class App extends React.Component {\n constructor() {\n super();\n this.state = {\n selectedEndpoint: '',\n servicesMap: {},\n openTab: 'servicesList',\n refreshing: false,\n servicesList: []\n };\n }\n\n onEndpointSelect = (service) => {\n let newServicesMap = Object.assign(this.state.servicesMap);\n if (service) {\n newServicesMap[service.endpoint] = service;\n }\n this.setState({\n selectedEndpoint: service ? service.endpoint : undefined,\n servicesMap: newServicesMap,\n openTab: 'testBench',\n });\n }\n\n handleTabSelect = (key) => {\n this.setState({ openTab: key });\n };\n\n render() {\n return (\n \n
    \n

    Reconciliation service test bench

    \n

    Source repository

    \n
      \n \n \n
    \n \n \n \n \n \n \n \n \n \n } />\n
    \n
    \n );\n }\n}\n\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.92ce8616.chunk.js.map b/static/js/main.92ce8616.chunk.js.map deleted file mode 100644 index 3bdfef3..0000000 --- a/static/js/main.92ce8616.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["JsonValidator.js","FeatureCell.js","utils.js","JsonSchemas.js","ReconciliationService.js","FeatureRow.js","FeatureTable.js","TabLink.js","ReconciliationServiceInput.js","ReconcileSuggest.js","GenericInput.js","PropertyMapping.js","Candidate.js","PreviewRenderer.js","DataExtensionValue.js","DataExtensionTab.js","TestBench.js","App.js","serviceWorker.js","index.js"],"names":["FeatureCell","glyph","text","color","cellClass","this","props","value","span","react_default","a","createElement","className","sr-only","style","link","onClick","Button_default","bsStyle","bsSize","title","React","Component","addParams","baseUrl","params","url","URL","Object","keys","forEach","key","searchParams","append","toString","fetchJsonpParams","fetchJsonp","timeout","fetchParams","fetch","jsonTheme","scheme","author","base00","base01","base02","base03","base04","base05","base06","base07","base08","base09","base0A","base0B","base0C","base0D","base0E","base0F","specVersions","validatorAjv","Ajv","allErrors","compiledSchemas","_i","_Object$entries","entries","0.1","data-extension-query","$schema","$id","type","description","properties","ids","items","id","settings","required","data-extension-response","meta","name","rows","patternProperties",".*","oneOf","additionalProperties","str","float","int","date","pattern","manifest","identifierSpace","schemaSpace","view","defaultTypes","uniqueItems","suggest","definitions","service_definition","service_url","service_path","flyout_service_url","flyout_service_path","entity","$ref","property","preview","width","height","extend","propose_properties","property_settings","enum","default","label","help_text","choices","reconciliation-query-batch","property_value","^.*$","query","limit","pid","v","type_strict","reconciliation-result-batch","result","score","match","suggest-entities-response","notable","suggest-properties-response","suggest-types-response","latest","versions","contains","feature_view","serverLimits","batchRate","maxConnections","features","length","JsonValidator_ref3","JsonValidator_ref2","slicedToArray","version","schemas","compiled","_i2","_Object$entries2","_ref6","_ref5","schema","compile","getSchema","schemaName","ReconciliationService","endpoint","cors","classCallCheck","latestCompatibleVersion","_iteratorNormalCompletion","_didIteratorError","_iteratorError","undefined","_step","_iterator","Symbol","iterator","next","done","err","return","FeatureRow","_this","possibleConstructorReturn","getPrototypeOf","call","checkJsonp","setState","reacheableJSONP","then","response","json","catch","error","triggerOnSelect","onSelect","reconciliationService","state","reacheableCORS","_this2","jsonp","isReacheable","suggestSettings","parts","documentation","source_url","push","href","target","rel","wd_uri","nameCell","disabled","FeatureCell_FeatureCell","hasView","hasSuggestEntity","hasSuggestType","hasSuggestProperty","hasPreview","hasExtend","Row","FeatureTable","refreshServicesFromWD","method","refreshing","sparql_query","format","promise","urlParams","URLSearchParams","mode","cache","headers","Content-Type","body","services","results","bindings","map","entry","serviceLabel","source","service","console","log","loadAllJsonp","row","useJsonp","openAddServiceDialog","showAddServiceDialog","closeAddServiceDialog","Fragment","Table_default","striped","bordered","hover","FeatureRow_FeatureRow","Modal_default","show","onHide","Header","closeButton","Title","Body","sparqlQueryUrl","encodeURIComponent","TabLink","_ref","to","exact","useRouteMatch","path","role","react_router_dom","ReconciliationServiceInput","initialService","timer","validateEndpoint","e","clearTimeout","setTimeout","_this3","_setService","_setError","onChange","message","getValidationState","startsWith","preventDefault","_this4","Form_default","horizontal","onSubmit","handleSubmit","FormGroup_default","controlId","validationState","Col_default","componentClass","ControlLabel","sm","FormControl_default","placeholder","handleChange","Feedback","HelpBlock_default","getMessage","ReconcileSuggest","onSuggestionsFetchRequested","getUrl","prefix","isLoading","getFetcher","fetcher","suggestions","onSuggestionsClearRequested","newValue","configuration","entityClass","lib","onSearch","options","labelKey","filterBy","option","selected","getValue","renderMenuItemChildren","index","Array","isArray","broader","join","GenericInput","onSuggestChange","onIdChange","currentTarget","explicitSubmit","hasAutocomplete","ReconcileSuggest_ReconcileSuggest","currentValue","InputGroup_default","currentId","Button","val","PropertyMapping","newMapping","emitChange","concat","deleteMapping","idx","newArray","slice","splice","onValueChange","onPropertyChange","propertyValue","mapping","display","marginBottom","GenericInput_GenericInput","renderMappings","Candidate","candidate","types","feature","ListGroupItem_default","header","active","Badge_default","renderDescription","renderTypes","renderFeatures","replace","PreviewRenderer","iframe","iframeUrl","Number","isInteger","__html","_","dangerouslySetInnerHTML","DataExtensionValue","renderedValue","datatype","DataExtensionTab","onEntityChange","extendResults","validationErrors","resetQuery","submitQuery","formulateQueryUrl","validateServiceResponse","exdentResults","extendError","JSON","stringify","formulateQuery","values","ListGroup_default","DataExtensionValue_DataExtensionValue","errors","dataPath","react_json_tree_lib_default","theme","data","getItemString","itemType","itemString","shouldExpandNode","keyName","level","hideRoot","renderResponseValidationErrors","renderQueryResults","TestBench","onReconQueryChange","reconQuery","onReconTypeChange","reconType","onCustomTypeChange","reconCustomType","onReconPropertiesChange","reconProperties","onReconLimitChange","reconLimit","onPreviewEntityChange","previewEntityId","onSubmitReconciliation","reconResults","q0","reconResponseValidationErrors","reconError","Candidate_Candidate","Alert_default","filter","m","isNaN","parseInt","queries","formulateReconQuery","current","t","Radio_default","checked","hasTypeSuggest","renderManifestValidationErrors","Tabs_default","defaultActiveKey","animation","Tab_default","eventKey","renderTypeChoices","PropertyMapping_PropertyMapping","renderReconResponseValidationErrors","hasPreviewService","PreviewRenderer_PreviewRenderer","hasDataExtension","DataExtensionTab_DataExtensionTab","TestbenchTab","servicesMap","onEndpointChange","useParams","decodeURIComponent","testBench","TestBench_TestBench","history","useHistory","ReconciliationServiceInput_ReconciliationServiceInput","TableTab","_ref2","onEndpointSelect","FeatureTable_FeatureTable","App","newServicesMap","assign","selectedEndpoint","openTab","handleTabSelect","servicesList","margin","react_router","children","_ref3","Boolean","window","location","hostname","ReactDOM","render","App_App","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"mLASA,6JCLqBA,mLAEf,IAAIC,EAAQ,GACRC,EAAO,GACPC,EAAQ,UACRC,EAAY,uBACS,IAArBC,KAAKC,MAAMC,OACbN,EAAQ,yBACRC,EAAO,YACPC,EAAQ,QACRC,EAAY,sBACkB,IAArBC,KAAKC,MAAMC,OACpBN,EAAQ,6BACRC,EAAO,cACPC,EAAQ,UACRC,EAAY,mBACkB,aAArBC,KAAKC,MAAMC,OACpBN,EAAQ,gCACRC,EAAO,eACuB,UAArBG,KAAKC,MAAMC,QACpBN,EAAQ,6BACRC,EAAO,mDACPE,EAAY,sBAEd,IAAII,EAAOC,EAAAC,EAAAC,cAAA,QAAMC,UAAWX,EAAOY,UAASX,EAAMY,MAAO,CAACX,MAAOA,KAC7DY,EAAOP,EAIX,OAHIH,KAAKC,MAAMU,SAAgC,UAArBX,KAAKC,MAAMC,QAClCQ,EAAON,EAAAC,EAAAC,cAACM,EAAAP,EAAD,CAAQM,QAASX,KAAKC,MAAMU,QAASE,QAAQ,UAAUC,OAAO,SAASC,MAAM,oBAAoBZ,IAGzGC,EAAAC,EAAAC,cAAA,MAAIC,UAAW,eAAeR,GAC1BW,UA/B6BM,IAAMC,4BCDzCC,EAAY,SAACC,EAASC,GACzB,IAAIC,EAAM,IAAIC,IAAIH,GAIlB,OAHIC,GACDG,OAAOC,KAAKJ,GAAQK,QAAQ,SAAAC,GAAG,OAAIL,EAAIM,aAAaC,OAAOF,EAAKN,EAAOM,MAEnEL,EAAIQ,YAGDC,EAAmB,SAACX,EAASC,GACvC,OAAOW,IAAWb,EAAUC,EAASC,GAAS,CAACY,QAAS,OAG9CC,EAAc,SAACd,EAASC,GAClC,OAAOc,MAAMhB,EAAUC,EAASC,KAGtBe,EAAY,CACrBC,OAAQ,UACRC,OAAQ,0CACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,UACRC,OAAQ,WChCCC,EAAe,CAC5B,MACA,4BHHMC,EAAe,WAAIC,GAAI,CAACC,WAAW,IAGnCC,EAAkB,GAExBC,EAAA,EAAAC,EAA+BrC,OAAOsC,QGCX,CAC3BC,GAAO,CACPC,uBACA,CACEC,QAAW,iCACXC,IAAO,mFACPC,KAAQ,SACRC,YAAe,+CACfC,WAAc,CACZC,IAAO,CACLH,KAAQ,QACRC,YAAe,+DACfG,MAAS,CACPJ,KAAQ,WAGZE,WAAc,CACZF,KAAQ,QACRC,YAAe,qEACfG,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVM,SAAY,CACVN,KAAQ,WAGZO,SAAY,CACV,SAKRA,SAAY,CACV,MACA,eAIJC,0BACA,CACEV,QAAW,iCACXC,IAAO,sFACPC,KAAQ,SACRC,YAAe,kDACfC,WAAc,CACZO,KAAQ,CACNT,KAAQ,QACRI,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,UAEVA,KAAQ,CACNA,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,WAGZO,SAAY,CACV,QAINA,SAAY,CACV,KACA,UAINI,KAAQ,CACNX,KAAQ,SACRY,kBAAqB,CACnBC,KAAM,CACJb,KAAQ,SACRY,kBAAqB,CACnBC,KAAM,CACJb,KAAQ,QACRI,MAAS,CACPU,MAAS,CACP,CACEd,KAAQ,SACRe,sBAAwB,GAE1B,CACEf,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,WAGZO,SAAY,CACV,KACA,QAEFQ,sBAAwB,GAE1B,CACEf,KAAQ,SACRE,WAAc,CACZc,IAAO,CACLhB,KAAQ,WAGZO,SAAY,CACV,OAEFQ,sBAAwB,GAE1B,CACEf,KAAQ,SACRE,WAAc,CACZe,MAAS,CACPjB,KAAQ,WAGZO,SAAY,CACV,SAEFQ,sBAAwB,GAE1B,CACEf,KAAQ,SACRE,WAAc,CACZgB,IAAO,CACLlB,KAAQ,YAGZO,SAAY,CACV,OAEFQ,sBAAwB,GAE1B,CACEf,KAAQ,SACRE,WAAc,CACZiB,KAAQ,CACNnB,KAAQ,SACRC,YAAe,wCACfmB,QAAW,6KAGfb,SAAY,CACV,QAEFQ,sBAAwB,WAU1CR,SAAY,CACV,OACA,SAIJc,SACA,CACEvB,QAAW,iCACXC,IAAO,uEACPC,KAAQ,SACRC,YAAe,wFACfC,WAAc,CACZQ,KAAQ,CACNV,KAAQ,SACRC,YAAe,wDAEjBqB,gBAAmB,CACjBtB,KAAQ,SACRC,YAAe,gEAEjBsB,YAAe,CACbvB,KAAQ,SACRC,YAAe,oDAEjBuB,KAAQ,CACNxB,KAAQ,SACRE,WAAc,CACZ/C,IAAO,CACL6C,KAAQ,SACRC,YAAe,0EACfmB,QAAW,uBAGfb,SAAY,CACV,QAGJkB,aAAgB,CACdzB,KAAQ,QACRC,YAAe,sFACfG,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,WAGZO,SAAY,CACV,KACA,SAGJmB,aAAe,GAEjBC,QAAW,CACT3B,KAAQ,SACRC,YAAe,qFACf2B,YAAe,CACbC,mBAAsB,CACpB7B,KAAQ,SACRE,WAAc,CACZ4B,YAAe,CACb9B,KAAQ,UAEV+B,aAAgB,CACd/B,KAAQ,UAEVgC,mBAAsB,CACpBhC,KAAQ,UAEViC,oBAAuB,CACrBjC,KAAQ,SACRoB,QAAW,oBAGfb,SAAY,KAGhBL,WAAc,CACZgC,OAAU,CACRC,KAAQ,uDAEVC,SAAY,CACVD,KAAQ,uDAEVnC,KAAQ,CACNmC,KAAQ,yDAIdE,QAAW,CACTrC,KAAQ,SACRC,YAAe,mEACfC,WAAc,CACZ/C,IAAO,CACL6C,KAAQ,SACRoB,QAAW,qBACXnB,YAAe,0EAEjBqC,MAAS,CACPtC,KAAQ,UACRC,YAAe,6DAEjBsC,OAAU,CACRvC,KAAQ,UACRC,YAAe,+DAGnBM,SAAY,CACV,MACA,QACA,WAGJiC,OAAU,CACRxC,KAAQ,SACRC,YAAe,qEACfC,WAAc,CACZuC,mBAAsB,CACpBzC,KAAQ,SACRC,YAAe,2EACfC,WAAc,CACZ4B,YAAe,CACb9B,KAAQ,UAEV+B,aAAgB,CACd/B,KAAQ,YAId0C,kBAAqB,CACnB1C,KAAQ,QACRC,YAAe,+EACfG,MAAS,CACPU,MAAS,CACP,CACEd,KAAQ,SACRC,YAAe,4CACfC,WAAc,CACZF,KAAQ,CACNA,KAAQ,SACR2C,KAAQ,CACN,WAGJC,QAAW,CACT5C,KAAQ,UAEV6C,MAAS,CACP7C,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,UAEV8C,UAAa,CACX9C,KAAQ,WAGZO,SAAY,CACV,OACA,QACA,SAGJ,CACEP,KAAQ,SACRC,YAAe,yCACfC,WAAc,CACZF,KAAQ,CACNA,KAAQ,SACR2C,KAAQ,CACN,SAGJC,QAAW,CACT5C,KAAQ,UAEV6C,MAAS,CACP7C,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,UAEV8C,UAAa,CACX9C,KAAQ,WAGZO,SAAY,CACV,OACA,QACA,SAGJ,CACEP,KAAQ,SACRC,YAAe,0CACfC,WAAc,CACZF,KAAQ,CACNA,KAAQ,SACR2C,KAAQ,CACN,aAGJC,QAAW,CACT5C,KAAQ,WAEV6C,MAAS,CACP7C,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,UAEV8C,UAAa,CACX9C,KAAQ,WAGZO,SAAY,CACV,OACA,QACA,SAGJ,CACEP,KAAQ,SACRC,YAAe,gDACfC,WAAc,CACZF,KAAQ,CACNA,KAAQ,SACR2C,KAAQ,CACN,WAGJC,QAAW,CACT5C,KAAQ,UAEV6C,MAAS,CACP7C,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,UAEV8C,UAAa,CACX9C,KAAQ,UAEV+C,QAAW,CACT/C,KAAQ,QACRI,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZlE,MAAS,CACPgE,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,WAGZO,SAAY,CACV,QACA,WAKRA,SAAY,CACV,OACA,QACA,OACA,kBAShBA,SAAY,CACV,OACA,kBACA,gBAIJyC,6BACA,CACElD,QAAW,iCACXC,IAAO,mFACPC,KAAQ,SACRC,YAAe,+IACf2B,YAAe,CACbqB,eAAkB,CAChBnC,MAAS,CACP,CACEd,KAAQ,UAEV,CACEA,KAAQ,UAEV,CACEA,KAAQ,WAEV,CACEA,KAAQ,SACRC,YAAe,wGACfC,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,WAGZO,SAAY,CACV,UAMVK,kBAAqB,CACnBsC,OAAQ,CACNlD,KAAQ,SACRE,WAAc,CACZiD,MAAS,CACPnD,KAAQ,SACRC,YAAe,2DAEjBD,KAAQ,CACNC,YAAe,gEACfa,MAAS,CACP,CACEd,KAAQ,UAEV,CACEA,KAAQ,QACRI,MAAS,CACPJ,KAAQ,aAKhBoD,MAAS,CACPpD,KAAQ,SACRC,YAAe,8CAEjBC,WAAc,CACZF,KAAQ,QACRC,YAAe,4DACfG,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZmD,IAAO,CACLrD,KAAQ,SACRC,YAAe,wFAEjBqD,EAAK,CACHrD,YAAe,mHACfa,MAAS,CACP,CACEqB,KAAQ,gCAEV,CACEnC,KAAQ,QACRI,MAAS,CACP+B,KAAQ,oCAMlB5B,SAAY,CACV,MACA,OAINgD,YAAe,CACbvD,KAAQ,SACRC,YAAe,kFACf0C,KAAQ,CACN,MACA,SACA,SAINpC,SAAY,CACV,SAEFQ,sBAAwB,KAK9ByC,8BACA,CACE1D,QAAW,iCACXC,IAAO,0FACPC,KAAQ,SACRC,YAAe,oGACfW,kBAAqB,CACnBsC,OAAQ,CACNlD,KAAQ,SACRE,WAAc,CACZuD,OAAU,CACRzD,KAAQ,QACRI,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,SACRC,YAAe,sCAEjBS,KAAQ,CACNV,KAAQ,SACRC,YAAe,gCAEjByD,MAAS,CACP1D,KAAQ,SACRC,YAAe,2EAEjB0D,MAAS,CACP3D,KAAQ,UACRC,YAAe,4EAEjBD,KAAQ,CACNA,KAAQ,QACRC,YAAe,wCACfG,MAAS,CACPU,MAAS,CACP,CACEd,KAAQ,SACRC,YAAe,qCACfC,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,WAGZO,SAAY,CACV,OAGJ,CACEP,KAAQ,SACRC,YAAe,yEAMzBM,SAAY,CACV,KACA,OACA,YAKRA,SAAY,CACV,aAMRqD,4BACA,CACE9D,QAAW,iCACXC,IAAO,wFACPC,KAAQ,SACRC,YAAe,2FACfC,WAAc,CACZuD,OAAU,CACRzD,KAAQ,QACRI,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,SACRC,YAAe,sCAEjBS,KAAQ,CACNV,KAAQ,SACRC,YAAe,gCAEjBA,YAAe,CACbD,KAAQ,SACRC,YAAe,oGAEjB4D,QAAW,CACT7D,KAAQ,QACRC,YAAe,sCACfG,MAAS,CACPU,MAAS,CACP,CACEd,KAAQ,SACRC,YAAe,qCACfC,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,WAGZO,SAAY,CACV,OAGJ,CACEP,KAAQ,SACRC,YAAe,yEAMzBM,SAAY,CACV,KACA,WAKRA,SAAY,CACV,WAIJuD,8BACA,CACEhE,QAAW,iCACXC,IAAO,0FACPC,KAAQ,SACRC,YAAe,6FACfC,WAAc,CACZuD,OAAU,CACRzD,KAAQ,QACRI,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,SACRC,YAAe,wCAEjBS,KAAQ,CACNV,KAAQ,SACRC,YAAe,kCAEjBA,YAAe,CACbD,KAAQ,SACRC,YAAe,qGAGnBM,SAAY,CACV,KACA,WAKRA,SAAY,CACV,WAIJwD,yBACA,CACEjE,QAAW,iCACXC,IAAO,qFACPC,KAAQ,SACRC,YAAe,wFACfC,WAAc,CACZuD,OAAU,CACRzD,KAAQ,QACRI,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,SACRC,YAAe,oCAEjBS,KAAQ,CACNV,KAAQ,SACRC,YAAe,8BAEjBA,YAAe,CACbD,KAAQ,SACRC,YAAe,qGAGnBM,SAAY,CACV,KACA,WAKRA,SAAY,CACV,YAKJyD,OAAU,CACVnE,uBACA,CACEC,QAAW,iCACXC,IAAO,sFACPC,KAAQ,SACRC,YAAe,+CACfC,WAAc,CACZC,IAAO,CACLH,KAAQ,QACRC,YAAe,+DACfG,MAAS,CACPJ,KAAQ,WAGZE,WAAc,CACZF,KAAQ,QACRC,YAAe,qEACfG,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVM,SAAY,CACVN,KAAQ,WAGZO,SAAY,CACV,SAKRA,SAAY,CACV,MACA,eAIJC,0BACA,CACEV,QAAW,iCACXC,IAAO,yFACPC,KAAQ,SACRC,YAAe,kDACfC,WAAc,CACZO,KAAQ,CACNT,KAAQ,QACRI,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,UAEVA,KAAQ,CACNA,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,WAGZO,SAAY,CACV,QAINA,SAAY,CACV,KACA,UAINI,KAAQ,CACNX,KAAQ,SACRY,kBAAqB,CACnBC,KAAM,CACJb,KAAQ,SACRY,kBAAqB,CACnBC,KAAM,CACJb,KAAQ,QACRI,MAAS,CACPU,MAAS,CACP,CACEd,KAAQ,SACRe,sBAAwB,GAE1B,CACEf,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,UAEVC,YAAe,CACbD,KAAQ,WAGZO,SAAY,CACV,KACA,QAEFQ,sBAAwB,GAE1B,CACEf,KAAQ,SACRE,WAAc,CACZc,IAAO,CACLhB,KAAQ,WAGZO,SAAY,CACV,OAEFQ,sBAAwB,GAE1B,CACEf,KAAQ,SACRE,WAAc,CACZe,MAAS,CACPjB,KAAQ,WAGZO,SAAY,CACV,SAEFQ,sBAAwB,GAE1B,CACEf,KAAQ,SACRE,WAAc,CACZgB,IAAO,CACLlB,KAAQ,YAGZO,SAAY,CACV,OAEFQ,sBAAwB,GAE1B,CACEf,KAAQ,SACRE,WAAc,CACZiB,KAAQ,CACNnB,KAAQ,SACRC,YAAe,wCACfmB,QAAW,6KAGfb,SAAY,CACV,QAEFQ,sBAAwB,WAU1CR,SAAY,CACV,OACA,SAIJc,SACA,CACEvB,QAAW,iCACXC,IAAO,0EACPC,KAAQ,SACRC,YAAe,wFACfC,WAAc,CACZ+D,SAAY,CACVjE,KAAQ,QACRC,YAAe,sDACfG,MAAS,CACPJ,KAAQ,UAEVkE,SAAY,CACVvB,KAAQ,CAAC,SAGbjC,KAAQ,CACNV,KAAQ,SACRC,YAAe,wDAEjBqB,gBAAmB,CACjBtB,KAAQ,SACRC,YAAe,gEAEjBsB,YAAe,CACbvB,KAAQ,SACRC,YAAe,oDAEjBuB,KAAQ,CACNxB,KAAQ,SACRE,WAAc,CACZ/C,IAAO,CACL6C,KAAQ,SACRC,YAAe,0EACfmB,QAAW,uBAGfb,SAAY,CACV,QAGJ4D,aAAgB,CACdnE,KAAQ,SACRE,WAAc,CACZ/C,IAAO,CACL6C,KAAQ,SACRC,YAAe,mFACfmB,QAAW,uBAGfb,SAAY,CACV,QAGJkB,aAAgB,CACdzB,KAAQ,QACRC,YAAe,sFACfG,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,WAGZO,SAAY,CACV,KACA,SAGJmB,aAAe,GAEjBC,QAAW,CACT3B,KAAQ,SACRC,YAAe,qFACf2B,YAAe,CACbC,mBAAsB,CACpB7B,KAAQ,SACRE,WAAc,CACZ4B,YAAe,CACb9B,KAAQ,UAEV+B,aAAgB,CACd/B,KAAQ,UAEVgC,mBAAsB,CACpBhC,KAAQ,UAEViC,oBAAuB,CACrBjC,KAAQ,SACRoB,QAAW,oBAGfb,SAAY,KAGhBL,WAAc,CACZgC,OAAU,CACRC,KAAQ,uDAEVC,SAAY,CACVD,KAAQ,uDAEVnC,KAAQ,CACNmC,KAAQ,yDAIdE,QAAW,CACTrC,KAAQ,SACRC,YAAe,mEACfC,WAAc,CACZ/C,IAAO,CACL6C,KAAQ,SACRoB,QAAW,qBACXnB,YAAe,0EAEjBqC,MAAS,CACPtC,KAAQ,UACRC,YAAe,6DAEjBsC,OAAU,CACRvC,KAAQ,UACRC,YAAe,+DAGnBM,SAAY,CACV,MACA,QACA,WAGJiC,OAAU,CACRxC,KAAQ,SACRC,YAAe,qEACfC,WAAc,CACZuC,mBAAsB,CACpBzC,KAAQ,SACRC,YAAe,2EACfC,WAAc,CACZ4B,YAAe,CACb9B,KAAQ,UAEV+B,aAAgB,CACd/B,KAAQ,YAId0C,kBAAqB,CACnB1C,KAAQ,QACRC,YAAe,+EACfG,MAAS,CACPU,MAAS,CACP,CACEd,KAAQ,SACRC,YAAe,4CACfC,WAAc,CACZF,KAAQ,CACNA,KAAQ,SACR2C,KAAQ,CACN,WAGJC,QAAW,CACT5C,KAAQ,UAEV6C,MAAS,CACP7C,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,UAEV8C,UAAa,CACX9C,KAAQ,WAGZO,SAAY,CACV,OACA,QACA,SAGJ,CACEP,KAAQ,SACRC,YAAe,yCACfC,WAAc,CACZF,KAAQ,CACNA,KAAQ,SACR2C,KAAQ,CACN,SAGJC,QAAW,CACT5C,KAAQ,UAEV6C,MAAS,CACP7C,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,UAEV8C,UAAa,CACX9C,KAAQ,WAGZO,SAAY,CACV,OACA,QACA,SAGJ,CACEP,KAAQ,SACRC,YAAe,0CACfC,WAAc,CACZF,KAAQ,CACNA,KAAQ,SACR2C,KAAQ,CACN,aAGJC,QAAW,CACT5C,KAAQ,WAEV6C,MAAS,CACP7C,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,UAEV8C,UAAa,CACX9C,KAAQ,WAGZO,SAAY,CACV,OACA,QACA,SAGJ,CACEP,KAAQ,SACRC,YAAe,gDACfC,WAAc,CACZF,KAAQ,CACNA,KAAQ,SACR2C,KAAQ,CACN,WAGJC,QAAW,CACT5C,KAAQ,UAEV6C,MAAS,CACP7C,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,UAEV8C,UAAa,CACX9C,KAAQ,UAEV+C,QAAW,CACT/C,KAAQ,QACRI,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZlE,MAAS,CACPgE,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,WAGZO,SAAY,CACV,QACA,WAKRA,SAAY,CACV,OACA,QACA,OACA,iBAQd6D,aAAgB,CACdpE,KAAQ,SACRC,YAAe,yDACfC,WAAc,CACnBmE,UAAa,CACJrE,KAAQ,UACRC,YAAe,yHAExBqE,eAAkB,CACTtE,KAAQ,UACRC,YAAe,kGAKvBM,SAAY,CACV,WACA,OACA,kBACA,gBAIJyC,6BACA,CACElD,QAAW,iCACXC,IAAO,sFACPC,KAAQ,SACRC,YAAe,+IACf2B,YAAe,CACbqB,eAAkB,CAChBnC,MAAS,CACP,CACEd,KAAQ,UAEV,CACEA,KAAQ,UAEV,CACEA,KAAQ,WAEV,CACEA,KAAQ,SACRC,YAAe,wGACfC,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,WAGZO,SAAY,CACV,UAMVK,kBAAqB,CACnBsC,OAAQ,CACNlD,KAAQ,SACRE,WAAc,CACZiD,MAAS,CACPnD,KAAQ,SACRC,YAAe,2DAEjBD,KAAQ,CACNC,YAAe,gEACfa,MAAS,CACP,CACEd,KAAQ,UAEV,CACEA,KAAQ,QACRI,MAAS,CACPJ,KAAQ,aAKhBoD,MAAS,CACPpD,KAAQ,SACRC,YAAe,8CAEjBC,WAAc,CACZF,KAAQ,QACRC,YAAe,4DACfG,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZmD,IAAO,CACLrD,KAAQ,SACRC,YAAe,wFAEjBqD,EAAK,CACHrD,YAAe,mHACfa,MAAS,CACP,CACEqB,KAAQ,gCAEV,CACEnC,KAAQ,QACRI,MAAS,CACP+B,KAAQ,oCAMlB5B,SAAY,CACV,MACA,OAINgD,YAAe,CACbvD,KAAQ,SACRC,YAAe,kFACf0C,KAAQ,CACN,MACA,SACA,SAINpC,SAAY,CACV,SAEFQ,sBAAwB,KAK9ByC,8BACA,CACE1D,QAAW,iCACXC,IAAO,6FACPC,KAAQ,SACRC,YAAe,oGACfW,kBAAqB,CACnBsC,OAAQ,CACNlD,KAAQ,SACRE,WAAc,CACZuD,OAAU,CACRzD,KAAQ,QACRI,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,SACRC,YAAe,sCAEjBS,KAAQ,CACNV,KAAQ,SACRC,YAAe,gCAEjBA,YAAe,CACbD,KAAQ,SACRC,YAAe,gDAEjByD,MAAS,CACP1D,KAAQ,SACRC,YAAe,2EAEjBsE,SAAY,CACVvE,KAAQ,QACRC,YAAe,kEACfG,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,SACRC,YAAe,8CAEjBjE,MAAS,CACPiE,YAAe,6DACfa,MAAS,CACP,CACEd,KAAQ,WAEV,CACEA,KAAQ,eAOpB2D,MAAS,CACP3D,KAAQ,UACRC,YAAe,4EAEjBD,KAAQ,CACNA,KAAQ,QACRC,YAAe,wCACfG,MAAS,CACPU,MAAS,CACP,CACEd,KAAQ,SACRC,YAAe,qCACfC,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,WAGZO,SAAY,CACV,OAGJ,CACEP,KAAQ,SACRC,YAAe,yEAMzBM,SAAY,CACV,KACA,OACA,YAKRA,SAAY,CACV,aAMRqD,4BACA,CACE9D,QAAW,iCACXC,IAAO,2FACPC,KAAQ,SACRC,YAAe,2FACfC,WAAc,CACZuD,OAAU,CACRzD,KAAQ,QACRI,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,SACRC,YAAe,sCAEjBS,KAAQ,CACNV,KAAQ,SACRC,YAAe,gCAEjBA,YAAe,CACbD,KAAQ,SACRC,YAAe,oGAEjB4D,QAAW,CACT7D,KAAQ,QACRC,YAAe,sCACfG,MAAS,CACPU,MAAS,CACP,CACEd,KAAQ,SACRC,YAAe,qCACfC,WAAc,CACZG,GAAM,CACJL,KAAQ,UAEVU,KAAQ,CACNV,KAAQ,WAGZO,SAAY,CACV,OAGJ,CACEP,KAAQ,SACRC,YAAe,yEAMzBM,SAAY,CACV,KACA,WAKRA,SAAY,CACV,WAIJuD,8BACA,CACEhE,QAAW,iCACXC,IAAO,6FACPC,KAAQ,SACRC,YAAe,6FACfC,WAAc,CACZuD,OAAU,CACRzD,KAAQ,QACRI,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,SACRC,YAAe,wCAEjBS,KAAQ,CACNV,KAAQ,SACRC,YAAe,kCAEjBA,YAAe,CACbD,KAAQ,SACRC,YAAe,qGAGnBM,SAAY,CACV,KACA,WAKRA,SAAY,CACV,WAIJwD,yBACA,CACEjE,QAAW,iCACXC,IAAO,wFACPC,KAAQ,SACRC,YAAe,wFACfC,WAAc,CACZuD,OAAU,CACRzD,KAAQ,QACRI,MAAS,CACPJ,KAAQ,SACRE,WAAc,CACZG,GAAM,CACJL,KAAQ,SACRC,YAAe,oCAEjBS,KAAQ,CACNV,KAAQ,SACRC,YAAe,8BAEjBA,YAAe,CACbD,KAAQ,SACRC,YAAe,qGAGnBM,SAAY,CACV,KACA,WAKRA,SAAY,CACV,cHtlDJd,EAAAC,EAAA8E,OAAA/E,IAA4D,CAE3D,IAF2D,IAAAgF,EAAA/E,EAAAD,GAAAiF,EAAArH,OAAAsH,EAAA,EAAAtH,CAAAoH,EAAA,GAAlDG,EAAkDF,EAAA,GAAzCG,EAAyCH,EAAA,GACvDI,EAAW,GACfC,EAAA,EAAAC,EAA2B3H,OAAOsC,QAAQkF,GAA1CE,EAAAC,EAAAR,OAAAO,IAAoD,KAAAE,EAAAD,EAAAD,GAAAG,EAAA7H,OAAAsH,EAAA,EAAAtH,CAAA4H,EAAA,GAA1CvE,EAA0CwE,EAAA,GAApCC,EAAoCD,EAAA,GACnDJ,EAASpE,GAAQrB,EAAa+F,QAAQD,GAEvC3F,EAAgBoF,GAAWE,EAMrB,IAAMO,EAAY,SAACT,EAASU,GAElC,OAAO9F,EADyB,OAAZoF,EAAmB,MAAQA,GACTU,IIjBlBC,aACjB,SAAAA,EAAYC,EAAUnE,EAAUoE,GAAOpI,OAAAqI,EAAA,EAAArI,CAAAvB,KAAAyJ,GACpCzJ,KAAK0J,SAAWA,EAChB1J,KAAKuF,SAAWA,EAChBvF,KAAK2J,KAAOA,EAIZ3J,KAAK6J,wBAA0B,KAPI,IAAAC,GAAA,EAAAC,GAAA,EAAAC,OAAAC,EAAA,IAQnC,QAAAC,EAAAC,EAAoB7G,EAApB8G,OAAAC,cAAAP,GAAAI,EAAAC,EAAAG,QAAAC,MAAAT,GAAA,EAAkC,KAAzBhB,EAAyBoB,EAAAhK,MACxBqJ,EAAUT,EAAS,WACpBO,CAAO9D,KAErBvF,KAAK6J,wBAA0Bf,IAZS,MAAA0B,GAAAT,GAAA,EAAAC,EAAAQ,EAAA,YAAAV,GAAA,MAAAK,EAAAM,QAAAN,EAAAM,SAAA,WAAAV,EAAA,MAAAC,6DAkBnC,OAAOhK,KAAK2J,KAAO1H,EAAcH,WCjBnB4I,cAClB,SAAAA,IAAc,IAAAC,EAAA,OAAApJ,OAAAqI,EAAA,EAAArI,CAAAvB,KAAA0K,IACXC,EAAApJ,OAAAqJ,EAAA,EAAArJ,CAAAvB,KAAAuB,OAAAsJ,EAAA,EAAAtJ,CAAAmJ,GAAAI,KAAA9K,QAoBH+K,WAAa,WACVJ,EAAKK,SAAS,CAACC,gBAAiB,aAChClJ,IAAW4I,EAAK1K,MAAMyJ,UACnBwB,KAAK,SAAAC,GAAQ,OAAIA,EAASC,SAC1BF,KAAK,SAAAC,GAAQ,OAAIR,EAAKK,SAAS,CAACzF,SAAU4F,EAAUF,iBAAiB,MACrEI,MAAM,SAAAC,GAAK,OAAIX,EAAKK,SAAS,CAACC,iBAAiB,OA1BvCN,EAoGdY,gBAAkB,WACXZ,EAAK1K,MAAMuL,UACbb,EAAK1K,MAAMuL,SAASb,EAAKc,0BApG3Bd,EAAKe,MAAQ,CACXC,eAAgB,WAChBV,gBAAiB,QACjB1F,SAAU,IALDoF,mFASM,IAAAiB,EAAA5L,KACjBkC,MAAMlC,KAAKC,MAAMyJ,SAAU,CAAE1H,QAAS,MACnCkJ,KAAK,SAAAC,GAAQ,OAAIA,EAASC,SAC1BF,KAAK,SAAAC,GAAQ,OAAIS,EAAKZ,SAAS,CAACzF,SAAU4F,EAAUQ,gBAAgB,MACpEN,MAAM,SAAAC,GACJM,EAAKZ,SAAS,CAACW,gBAAgB,MAEhC3L,KAAKC,MAAM4L,OACb7L,KAAK+K,uDAaP,OAAO/K,KAAK0L,MAAMnG,SAASM,SAAW,qCAQtC,OAAK7F,KAAK8L,aAEH,QAAU9L,KAAK0L,MAAMnG,SAASG,MAAQ,IADpC,gDAKT,OAAK1F,KAAK8L,aAEH,WAAY9L,KAAK+L,kBADf,kDAKT,OAAK/L,KAAK8L,aAEH,aAAc9L,KAAK+L,kBADjB,8CAKT,OAAK/L,KAAK8L,aAEH,SAAU9L,KAAK+L,kBADb,0CAKT,OAAK/L,KAAK8L,aAEH,YAAa9L,KAAK0L,MAAMnG,SADtB,yCAKT,OAAKvF,KAAK8L,aAEH,WAAY9L,KAAK0L,MAAMnG,SADrB,qDAKT,OAAO,IAAIkE,EAAsBzJ,KAAKC,MAAMyJ,SAAU1J,KAAK0L,MAAMnG,SAAUvF,KAAK0L,MAAMC,mDAItF,IAAIK,EAAQ,CACV5L,EAAAC,EAAAC,cAAA,QAAMoB,IAAI,QAAQ1B,KAAKC,MAAM2E,OAkB/B,OAhBI5E,KAAKC,MAAMgM,gBAAkBjM,KAAKC,MAAMiM,YACzCF,EAAMG,KAAK/L,EAAAC,EAAAC,cAAA,QAAMoB,IAAI,QAAV,KAAmBtB,EAAAC,EAAAC,cAAA,KAAG8L,KAAMpM,KAAKC,MAAMgM,cAAeI,OAAO,SAASC,IAAI,sBAAsBvL,MAAM,+BAAnF,QAAnB,MAEVf,KAAKC,MAAMgM,eAAiBjM,KAAKC,MAAMiM,YACxCF,EAAMG,KAAK/L,EAAAC,EAAAC,cAAA,QAAMoB,IAAI,QAAV,KAAmBtB,EAAAC,EAAAC,cAAA,KAAG8L,KAAMpM,KAAKC,MAAMgM,cAAeI,OAAO,SAASC,IAAI,sBAAsBvL,MAAM,+BAAnF,QAAnB,KAA8IX,EAAAC,EAAAC,cAAA,KAAG8L,KAAMpM,KAAKC,MAAMiM,WAAYG,OAAO,SAASC,IAAI,sBAAsBvL,MAAM,6BAAhF,UAA9I,OAETf,KAAKC,MAAMgM,eAAiBjM,KAAKC,MAAMiM,YACzCF,EAAMG,KAAK/L,EAAAC,EAAAC,cAAA,QAAMoB,IAAI,QAAV,KAAmBtB,EAAAC,EAAAC,cAAA,KAAG8L,KAAMpM,KAAKC,MAAMiM,WAAYG,OAAO,SAASC,IAAI,sBAAsBvL,MAAM,6BAAhF,UAAnB,MAEVf,KAAKC,MAAMsM,QACZP,EAAMG,KAAK/L,EAAAC,EAAAC,cAAA,QAAMoB,IAAI,KAAKjB,MAAO,CAAC0E,MAAO,UACvC/E,EAAAC,EAAAC,cAAA,KAAG8L,KAAMpM,KAAKC,MAAMsM,OAAO,SAAUF,OAAO,SAASC,IAAI,sBAAsBvL,MAAM,oBACpFX,EAAAC,EAAAC,cAAA,QAAMC,UAAU,kCAIfyL,mCAUP,OACE5L,EAAAC,EAAAC,cAAA,UACIF,EAAAC,EAAAC,cAAA,UAAKN,KAAKwM,YACVpM,EAAAC,EAAAC,cAAA,UAAIF,EAAAC,EAAAC,cAACM,EAAAP,EAAD,CAAQQ,QAAQ,UAAUC,OAAO,SAASH,QAASX,KAAKuL,gBAAiBxK,MAAM,oBAAoB0L,UAAWzM,KAAK8L,cAAc1L,EAAAC,EAAAC,cAAA,QAAMC,UAAU,8BAA4C,IAAIH,EAAAC,EAAAC,cAAA,KAAG8L,KAAMpM,KAAKC,MAAMyJ,SAAU2C,OAAO,SAASC,IAAI,uBAAuBtM,KAAKC,MAAMyJ,WAChStJ,EAAAC,EAAAC,cAAA,MAAIC,UAAW,eAAgBP,KAAKyL,wBAAwB5B,yBAA2B,KAChFzJ,EAAAC,EAAAC,cAACoM,EAAD,CAAaxM,MAAOF,KAAK0L,MAAMC,iBAC/BvL,EAAAC,EAAAC,cAACoM,EAAD,CAAaxM,MAAOF,KAAK0L,MAAMT,gBAAiBtK,QAASX,KAAK+K,aAC9D3K,EAAAC,EAAAC,cAACoM,EAAD,CAAaxM,MAAOF,KAAK2M,YACzBvM,EAAAC,EAAAC,cAACoM,EAAD,CAAaxM,MAAOF,KAAK4M,qBACzBxM,EAAAC,EAAAC,cAACoM,EAAD,CAAaxM,MAAOF,KAAK6M,mBACzBzM,EAAAC,EAAAC,cAACoM,EAAD,CAAaxM,MAAOF,KAAK8M,uBACzB1M,EAAAC,EAAAC,cAACoM,EAAD,CAAaxM,MAAOF,KAAK+M,eACzB3M,EAAAC,EAAAC,cAACoM,EAAD,CAAaxM,MAAOF,KAAKgN,oDArF/B,OAAqC,IAA9BhN,KAAK0L,MAAMC,iBAA0D,IAA/B3L,KAAK0L,MAAMT,uBAnCtBjK,IAAMC,WCDxCgM,aACF,SAAAA,EAAYvD,EAAU9E,EAAMqH,EAAeC,EAAYK,GAAShL,OAAAqI,EAAA,EAAArI,CAAAvB,KAAAiN,GAC7DjN,KAAK0J,SAAWA,EAChB1J,KAAK4E,KAAOA,EACZ5E,KAAKiM,cAAgBA,EACrBjM,KAAKkM,WAAaA,EAClBlM,KAAKuM,OAASA,EACdvM,KAAK6L,OAAQ,yDAIb7L,KAAK6L,OAAQ,WAKCqB,cACjB,SAAAA,IAAc,IAAAvC,EAAA,OAAApJ,OAAAqI,EAAA,EAAArI,CAAAvB,KAAAkN,IACZvC,EAAApJ,OAAAqJ,EAAA,EAAArJ,CAAAvB,KAAAuB,OAAAsJ,EAAA,EAAAtJ,CAAA2L,GAAApC,KAAA9K,QAoBFmN,sBAAwB,SAACC,GACtBzC,EAAKK,SAAS,CACZqC,YAAY,IAEd,IAAIhM,EAAM,IAAIC,IAAI,qCACdF,EAAS,CAACiG,MAAMsD,EAAK2C,aAAcC,OAAQ,QAC3CC,EAAU,KACd,GAAe,QAAXJ,EACF7L,OAAOC,KAAKJ,GAAQK,QAAQ,SAAAC,GAAG,OAAIL,EAAIM,aAAaC,OAAOF,EAAKN,EAAOM,MACvE8L,EAAUtL,MAAMb,OACX,CACL,IAAIoM,EAAY,IAAIC,gBACpBnM,OAAOC,KAAKJ,GAAQK,QAAQ,SAAAC,GAAG,OAAI+L,EAAU7L,OAAOF,EAAKN,EAAOM,MAChE8L,EAAUtL,MAAMb,EAAK,CACnB+L,OAAQ,OACRO,KAAM,OACNC,MAAO,WACPC,QAAS,CAAEC,eAAgB,qCAC3BC,KAAMN,IAIVD,EACEtC,KAAK,SAAAvD,GAAM,OAAIA,EAAOyD,SACtBF,KAAK,SAAAvD,GAAM,OACRgD,EAAKK,SAAS,CACZgD,SAAUrG,EAAOsG,QAAQC,SAASC,IAAI,SAAAC,GAAK,OACzC,IAAInB,EAAImB,EAAM1E,SAASxJ,MAAOkO,EAAMC,aAAanO,MAC7C,kBAAmBkO,EAAQA,EAAMnC,cAAc/L,WAAQ+J,EACvD,WAAYmE,EAAQA,EAAME,OAAOpO,WAAQ+J,EACzCmE,EAAMG,QAAQrO,SACpBmN,YAAY,MAGjBhC,MAAM,SAAAC,GACJkD,QAAQC,IAAInD,GACZX,EAAKK,SAAS,CAAEqC,YAAY,OAzDrB1C,EAiEd+D,aAAe,WACZ/D,EAAKK,SAAS,CACbgD,SAAUrD,EAAKe,MAAMsC,SAASG,IAAI,SAAAQ,GAAyB,OAAhBA,EAAIC,WAAmBD,OAnExDhE,EAuEdkE,qBAAuB,WACnBlE,EAAKK,SAAS,CACX8D,sBAAsB,KAzEfnE,EA6EdoE,sBAAwB,WACpBpE,EAAKK,SAAS,CACX8D,sBAAsB,KA7E1BnE,EAAKe,MAAQ,CACXsC,SAAU,GACVc,sBAAsB,EACtBzB,YAAY,GAGd1C,EAAK2C,aACJ,mdATU3C,mFA8DX3K,KAAKmN,sBAAsB,wCAyBrB,IAAAvB,EAAA5L,KACP,OACEI,EAAAC,EAAAC,cAAAF,EAAAC,EAAA2O,SAAA,KACE5O,EAAAC,EAAAC,cAAA,mBAAUF,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,yDAAR,qCAAV,+BAA2IhM,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,+DAAR,QAA3I,4CAAmQ,IACnQhM,EAAAC,EAAAC,cAAA,QAAMC,UAAU,+BADhB,0DAC2GH,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,uCAAR,SAD3G,8KAEyKhM,EAAAC,EAAAC,cAACM,EAAAP,EAAD,CAAQM,QAASX,KAAK0O,aAAc5N,OAAO,UAA3C,gCAFzK,KAIFV,EAAAC,EAAAC,cAAC2O,EAAA5O,EAAD,CAAO6O,SAAO,EAACC,UAAQ,EAACC,OAAK,GAC1BhP,EAAAC,EAAAC,cAAA,aACEF,EAAAC,EAAAC,cAAA,UACEF,EAAAC,EAAAC,cAAA,kBACAF,EAAAC,EAAAC,cAAA,sBACPF,EAAAC,EAAAC,cAAA,yBACOF,EAAAC,EAAAC,cAAA,kBACAF,EAAAC,EAAAC,cAAA,mBACAF,EAAAC,EAAAC,cAAA,2BACAF,EAAAC,EAAAC,cAAA,8BACAF,EAAAC,EAAAC,cAAA,2BACAF,EAAAC,EAAAC,cAAA,gCACAF,EAAAC,EAAAC,cAAA,8BACAF,EAAAC,EAAAC,cAAA,2BAGJF,EAAAC,EAAAC,cAAA,aACIN,KAAK0L,MAAMsC,SAASG,IACnB,SAAAQ,GAAG,OAAIvO,EAAAC,EAAAC,cAAC+O,EAAD,CACC3F,SAAUiF,EAAIjF,SACd9E,KAAM+J,EAAI/J,KACVqH,cAAe0C,EAAI1C,cACnBC,WAAYyC,EAAIzC,WAChBK,OAAQoC,EAAIpC,OACZV,MAAO8C,EAAI9C,MACXL,SAAUI,EAAK3L,MAAMuL,SACrB9J,IAAKiN,EAAIpC,OAAO,IAAIoC,EAAIjF,UAAUiF,EAAI9C,MAAQ,SAAW,eAIzEzL,EAAAC,EAAAC,cAACM,EAAAP,EAAD,CAAQM,QAASX,KAAK6O,sBAAsBzO,EAAAC,EAAAC,cAAA,QAAMC,UAAU,6BAA5D,kBAnCA,eAoCAH,EAAAC,EAAAC,cAACM,EAAAP,EAAD,CAAQM,QAAS,kBAAMiL,EAAKuB,sBAAsB,SAASV,SAAUzM,KAAK0L,MAAM2B,YAAYjN,EAAAC,EAAAC,cAAA,QAAMC,UAAU,gCAA5G,IAAmJP,KAAK0L,MAAM2B,WAAa,mBAAgB,iBAE3LjN,EAAAC,EAAAC,cAACgP,EAAAjP,EAAD,CAAOkP,KAAMvP,KAAK0L,MAAMoD,qBAAsBU,OAAQxP,KAAK+O,uBACzD3O,EAAAC,EAAAC,cAACgP,EAAAjP,EAAMoP,OAAP,CAAcC,aAAW,GACvBtP,EAAAC,EAAAC,cAACgP,EAAAjP,EAAMsP,MAAP,2CAEFvP,EAAAC,EAAAC,cAACgP,EAAAjP,EAAMuP,KAAP,KACExP,EAAAC,EAAAC,cAAA,sCAC6BF,EAAAC,EAAAC,cAAA,KAAG8L,KAAMpM,KAAK6P,gBAAd,8BAD7B,oDAIAzP,EAAAC,EAAAC,cAAA,UACIF,EAAAC,EAAAC,cAAA,iGAAwFF,EAAAC,EAAAC,cAAA,yBAAxF,OAAkHF,EAAAC,EAAAC,cAAA,yBAAlH,yDACAF,EAAAC,EAAAC,cAAA,4HAAmHF,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,sDAAR,+BAAnH,uCAAmPhM,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,iDAAR,oBAAnP,KACAhM,EAAAC,EAAAC,cAAA,qDAA4CF,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,gDAAR,wBAA5C,yBAAiJhM,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,2CAAR,qDAAjJ,OAA4PhM,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,gDAAR,oBAA5P,8FAAkahM,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,gDAAR,4BAAla,OAAyfhM,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,+CAAR,2BAAzf,mBAA0lBhM,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,+CAAR,mCAA1lB,KACAhM,EAAAC,EAAAC,cAAA,mJAxDR,MAAO,+BAA+BwP,mBAAmB9P,KAAKsN,qBArF5BtM,IAAMC,2BCnBjC,SAAS8O,EAATC,GAAuC,IAApBC,EAAoBD,EAApBC,GAAIlP,EAAgBiP,EAAhBjP,MAAOmP,EAASF,EAATE,MAElC3P,EADW4P,YAAc,CAACC,KAAMH,EAAIC,MAAOA,IACpB,SAAW,GAExC,OACG9P,EAAAC,EAAAC,cAAA,MAAI+P,KAAK,eAAe9P,UAAWA,GAC/BH,EAAAC,EAAAC,cAACgQ,EAAA,EAAD,CAAML,GAAIA,GACLlP,2HCCIwP,8MAEnB7E,MAAQ,CACN6C,QAAS5D,EAAK1K,MAAMuQ,oGAInBxQ,KAAKyQ,MAAQ,iDAIdjC,QAAQC,IAAI,8BACZD,QAAQC,IAAIzO,KAAKC,MAAMuQ,gBACnBxQ,KAAKC,MAAMuQ,eAAe9G,WAAa1J,KAAKC,MAAMuQ,eAAejL,WACnEiJ,QAAQC,IAAI,gCACZzO,KAAK0Q,uDAIEnC,GACRvO,KAAKgL,SAAS,CAClBuD,QAASA,yCAIKoC,GAAG,IAAA/E,EAAA5L,KACb4Q,aAAa5Q,KAAKyQ,OAElBzQ,KAAKgL,SAAS,CAClBuD,QAAS,IAAI9E,EAAsBkH,EAAEtE,OAAOnM,WAAO+J,OAAWA,GACvDqB,WAAOrB,IAGVjK,KAAKyQ,MAAQI,WAAW,kBAAMjF,EAAK8E,oBAAoB,gDAGvC,IAAAI,EAAA9Q,KACZ0J,EAAW1J,KAAK0L,MAAM6C,QAAQ7E,SAClCxH,MAAMwH,GACJwB,KAAK,SAAAvD,GAAM,OAAIA,EAAOyD,SACtBF,KAAK,SAAAvD,GAAM,OAAImJ,EAAKC,YAAYrH,EAAU/B,GAAQ,KAClD0D,MAAM,SAAAsF,GAAC,OACR5O,IAAW2H,GACTwB,KAAK,SAAAvD,GAAM,OAAIA,EAAOyD,SACtBF,KAAK,SAAAvD,GAAM,OAAImJ,EAAKC,YAAYrH,EAAU/B,GAAQ,KAClD0D,MAAM,SAAAsF,GAAC,OAAIG,EAAKE,UAAUtH,EAAUiH,2CAG9BjH,EAAUnE,EAAUoE,GAC9B,GAAG3J,KAAK0L,MAAM6C,QAAQ7E,WAAaA,EAAU,CAChD,IAAI6E,EAAU,IAAI9E,EAAsBC,EAAUnE,EAAUoE,GACrD3J,KAAKgL,SAAS,CACnBuD,QAASA,SAEuBtE,IAAxBjK,KAAKC,MAAMgR,UACXjR,KAAKC,MAAMgR,SAAS1C,sCAKnB7E,EAAU4B,GACftL,KAAK0L,MAAM6C,QAAQ7E,WAAaA,IAC/B1J,KAAKgL,SAAS,CAACzF,cAAU0E,EAAWqB,MAAOA,SAChBrB,IAAxBjK,KAAKC,MAAMgR,UACXjR,KAAKC,MAAMgR,cAAShH,OAAWA,iDAMrC,YAA2BA,IAAvBjK,KAAK0L,MAAM6C,cAAyDtE,IAAhCjK,KAAK0L,MAAM6C,QAAQhJ,SACjD,eACqB0E,IAArBjK,KAAK0L,MAAMJ,MACX,QAEH,0CAIP,IAAI4F,EAAU,GACd,GAAkC,UAA9BlR,KAAKmR,qBAAkC,CACxCD,EAAU,oGACV,IAAIxH,EAAW1J,KAAK0L,MAAM6C,QAAQ7E,SAOlC,YANiBO,IAAbP,IACIA,EAAS0H,WAAW,YAChB1H,EAAS0H,WAAW,qBACpB1H,EAAS0H,WAAW,sBAC7BF,GAAW,yJAEPA,wCAIAP,GACVC,aAAa5Q,KAAKyQ,OAClBzQ,KAAK0Q,mBACLC,EAAEU,kDAGI,IAAAC,EAAAtR,KACN,OACGI,EAAAC,EAAAC,cAACiR,EAAAlR,EAAD,CAAMmR,YAAU,EAACC,SAAU,SAACd,GAAD,OAAOW,EAAKI,aAAaf,KAClDvQ,EAAAC,EAAAC,cAACqR,GAAAtR,EAAD,CAAWuR,UAAU,gBAAgBC,gBAAiB7R,KAAKmR,sBACzD/Q,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK0R,eAAgBC,KAAcC,GAAI,GAAvC,aACA7R,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,IACL7R,EAAAC,EAAAC,cAAC4R,GAAA7R,EAAD,CAAa6D,KAAK,OAAOhE,MAAOF,KAAK0L,MAAM6C,QAAQ7E,SAAUyI,YAAY,6CAA6ClB,SAAU,SAAAN,GAAC,OAAIW,EAAKc,aAAazB,MACvJvQ,EAAAC,EAAAC,cAAC4R,GAAA7R,EAAYgS,SAAb,MACAjS,EAAAC,EAAAC,cAACgS,GAAAjS,EAAD,KAAYL,KAAKuS,wBA3GuBvR,IAAMC,+ICRzCuR,eAClB,SAAAA,IAAc,IAAA7H,EAAA,OAAApJ,OAAAqI,EAAA,EAAArI,CAAAvB,KAAAwS,IACZ7H,EAAApJ,OAAAqJ,EAAA,EAAArJ,CAAAvB,KAAAuB,OAAAsJ,EAAA,EAAAtJ,CAAAiR,GAAA1H,KAAA9K,QAmCFyS,4BAA8B,SAACvS,GAC5B,IAAImB,EAAMsJ,EAAK+H,SACXtR,EAAS,CAACuR,OAASzS,GACX,OAARmB,IAGJsJ,EAAKK,SAAS,CAAC4H,WAAW,IACZjI,EAAK1K,MAAMsO,QAAQsE,YACjCC,CAAQzR,EAAKD,GACV8J,KAAK,SAAAvD,GAAM,OAAIA,EAAOyD,SACtBF,KAAK,SAAAvD,GACHgD,EAAKK,SAAS,CAAC+H,YAAapL,EAAOA,OAAQiL,WAAW,MACxDvH,MAAM,SAAAsF,GACJnC,QAAQC,IAAIkC,GACZhG,EAAKK,SAAS,CAAC4H,WAAW,QAlDpBjI,EAsDdqI,4BAA8B,WAC3BrI,EAAKK,SAAS,CAAC+H,YAAY,MAvDhBpI,EA0DdsG,SAAW,SAACgC,QACkBhJ,IAAxBU,EAAK1K,MAAMgR,SACbtG,EAAKK,SAAS,CACZ9K,MAAO+S,EAAS,KAGjBtI,EAAK1K,MAAMgR,SAASgC,EAAS,KA9DhCtI,EAAKe,MAAQ,CACVxL,WAAO+J,EACP8I,YAAa,GACbH,WAAW,GALFjI,0EAUZ,YAA4BV,IAAxBjK,KAAKC,MAAMgR,SACLjR,KAAKC,MAAMC,MAEXF,KAAK0L,MAAMxL,uCAarB,IAAKF,KAAKuF,WAAavF,KAAKuF,SAASM,QAClC,OAAO,KAEV,IAAIqN,EAAgBlT,KAAKuF,SAASM,QAAQ7F,KAAKC,MAAMkT,aACrD,OAAKD,EAGEA,EAAclN,YAAckN,EAAcjN,aAFvC,sCAsCT,OACE7F,EAAAC,EAAAC,cAAC8S,GAAA,eAAD,CAAgB7O,GAAIvE,KAAKC,MAAMsE,GAC5BkI,SAA4B,OAAlBzM,KAAK0S,SACfE,UAAW5S,KAAK0L,MAAMkH,UACtBS,SAAUrT,KAAKyS,4BACfa,QAAStT,KAAK0L,MAAMqH,YACpBQ,SAAS,OACTC,SAAU,SAACC,EAAOxT,GAAR,OAAkB,GAC5ByT,SAAU1T,KAAK2T,WAAa,CAAC3T,KAAK2T,YAAc,GAChD1C,SAAUjR,KAAKiR,SACf2C,uBAAwB,SAACH,EAAQxT,EAAO4T,GAAhB,OACrBzT,EAAAC,EAAAC,cAAAF,EAAAC,EAAA2O,SAAA,KACG5O,EAAAC,EAAAC,cAAA,QAAMC,UAAU,iBAAiBkT,EAAOlP,IACvCuP,MAAMC,QAAQN,EAAOO,UAAYP,EAAOO,QAAQtL,QAAUtI,EAAAC,EAAAC,cAAA,QAAMC,UAAU,iBAAiBkT,EAAOO,QAAQ7F,IAAI,SAAAwC,GAAC,OAAIA,EAAEpM,KAAI0P,KAAK,MAApE,OAC3D7T,EAAAC,EAAAC,cAAA,QAAMC,UAAU,oBAAoBkT,EAAO7O,MAAYxE,EAAAC,EAAAC,cAAA,WACvDF,EAAAC,EAAAC,cAAA,QAAMC,UAAU,0BAA0BkT,EAAOtP,kDAlE5D,OAAKnE,KAAKC,MAAMsO,QAGbvO,KAAKC,MAAMsO,QAAQhJ,SAFnB,YApBqCvE,IAAMC,WCS/BiT,eACjB,SAAAA,IAAc,IAAAvJ,EAAA,OAAApJ,OAAAqI,EAAA,EAAArI,CAAAvB,KAAAkU,IACVvJ,EAAApJ,OAAAqJ,EAAA,EAAArJ,CAAAvB,KAAAuB,OAAAsJ,EAAA,EAAAtJ,CAAA2S,GAAApJ,KAAA9K,QA2CJmU,gBAAkB,SAAClB,GACftI,EAAKK,SAAS,CAAE9K,MAAO+S,SACKhJ,IAAxBU,EAAK1K,MAAMgR,UACXtG,EAAK1K,MAAMgR,SAASgC,IA/CdtI,EAmDdyJ,WAAa,SAACzD,GACV,IAAIsC,EAAW,CACP1O,GAAIoM,EAAE0D,cAAcnU,MACpB0E,KAAM+L,EAAE0D,cAAcnU,YAEF+J,IAAxBU,EAAK1K,MAAMgR,SACXtG,EAAKK,SAAS,CAAE9K,MAAO+S,SACchJ,IAA9BU,EAAK1K,MAAMqU,eAClB3J,EAAK1K,MAAMgR,SAASgC,GAEpBtI,EAAKK,SAAS,CAAE9K,MAAO+S,KA7DjBtI,EAiEd8G,SAAW,SAACd,GACRhG,EAAK1K,MAAMgR,SAAStG,EAAKe,MAAMxL,OAC/ByQ,EAAEU,kBAjEF1G,EAAKe,MAAQ,CACVxL,WAAO+J,GAHAU,0EAQV,YAA4BV,IAAxBjK,KAAKC,MAAMgR,SACJjR,KAAKC,MAAMC,MAEXF,KAAK0L,MAAMxL,uCA4DtB,OAAQF,KAAKuU,gBACRnU,EAAAC,EAAAC,cAACkU,GAAD,CAAkBjG,QAASvO,KAAKC,MAAMsO,QAAS4E,YAAanT,KAAKC,MAAMkT,YAAalC,SAAUjR,KAAKmU,gBAAiBjU,MAAOF,KAAKyU,oBAE9FxK,IAA9BjK,KAAKC,MAAMqU,eACZlU,EAAAC,EAAAC,cAACoU,GAAArU,EAAD,KACGD,EAAAC,EAAAC,cAAC4R,GAAA7R,EAAD,CACG6D,KAAK,OACLiO,YAAanS,KAAKmS,YAClBjS,MAAOF,KAAK2U,WAAa,GACzB1D,SAAUjR,KAAKoU,aACjBhU,EAAAC,EAAAC,cAACoU,GAAArU,EAAWuU,OAAZ,KACIxU,EAAAC,EAAAC,cAACM,EAAAP,EAAD,CAAQM,QAASX,KAAKyR,SAAUvN,KAAK,SAASrD,QAAQ,WAAtD,YAILT,EAAAC,EAAAC,cAAC4R,GAAA7R,EAAD,CACG6D,KAAK,OACLiO,YAAanS,KAAKmS,YAClBjS,MAAOF,KAAK2U,WAAa,GACzB1D,SAAUjR,KAAKoU,8CA1E7B,OAAKpU,KAAKC,MAAMsO,QAGLvO,KAAKC,MAAMsO,QAAQhJ,SAFnB,yCAOX,OAAOvF,KAAKC,MAAMkT,YAAc,2CAIhC,YAA4BlJ,IAAxBjK,KAAKC,MAAMgR,SACLjR,KAAK0L,MAAMxL,MAEXF,KAAKC,MAAMC,OAASF,KAAK0L,MAAMxL,wCAKzC,IAAI2U,EAAM7U,KAAKyU,aACf,YAAexK,IAAR4K,OAAoB5K,EAAY4K,EAAItQ,2CAI3C,OAAQvE,KAAKuF,UAAYvF,KAAKuF,SAASM,SAAW7F,KAAKuF,SAASM,QAAQ7F,KAAKC,MAAMkT,oBA1CjDnS,IAAMC,WCN3B6T,8MAEnBC,WAAa,WACVpK,EAAKqK,WACArK,EAAK1K,MAAMC,MAAM+U,OAAO,CAAC,CACrB3O,cAAU2D,EACV/J,MAAO,UAKnBgV,cAAgB,SAACC,GACd,IAAIC,EAAWzK,EAAK1K,MAAMC,MAAMmV,QAChCD,EAASE,OAAOH,EAAK,GACrBxK,EAAKqK,WAAWI,MAGnBG,cAAgB,SAACJ,EAAKxE,GACnB,IAAIyE,EAAWzK,EAAK1K,MAAMC,MAAMmV,QAC3B/O,EAAY8O,EAASD,GAArB7O,SACL8O,EAASD,GAAO,CAAC7O,WAAUpG,MAAOyQ,EAAE0D,cAAcnU,OAClDyK,EAAKqK,WAAWI,MAGnBI,iBAAmB,SAACL,EAAKM,GACtBjH,QAAQC,IAAI,sBACZD,QAAQC,IAAI0G,GACZ3G,QAAQC,IAAIgH,GACZ,IAAIL,EAAWzK,EAAK1K,MAAMC,MAAMmV,QAC3BnV,EAASkV,EAASD,GAAlBjV,MACLkV,EAASD,GAAO,CAAC7O,SAASmP,EAAevV,SACzCsO,QAAQC,IAAI2G,GACZzK,EAAKqK,WAAWI,8EAGRnC,GACJjT,KAAKC,MAAMgR,UACZjR,KAAKC,MAAMgR,SAASgC,4CAIT,IAAArH,EAAA5L,KACd,OAAOA,KAAKC,MAAMC,MAAMiO,IAAI,SAACuH,EAASP,GAAV,OACzB/U,EAAAC,EAAAC,cAAA,OAAKG,MAAO,CAACkV,QAAS,eAAgBC,aAAc,OAAQlU,IAAKyT,GAC7D/U,EAAAC,EAAAC,cAAA,OAAKG,MAAO,CAACkV,QAAS,eAAgBnP,MAAO,QACzCpG,EAAAC,EAAAC,cAACuV,GAAD,CACGtH,QAAS3C,EAAK3L,MAAMsO,QACpB4E,YAAY,WACZ5O,GAAI,oBAAoB4Q,EACxBjV,MAAOwV,EAAQpP,SACf2K,SAAU,SAAAzJ,GAAC,OAAIoE,EAAK4J,iBAAiBL,EAAK3N,OAEjDpH,EAAAC,EAAAC,cAAA,OAAKG,MAAO,CAACkV,QAAS,eAAgBnP,MAAO,QACzCpG,EAAAC,EAAAC,cAAC4R,GAAA7R,EAAD,CACG6D,KAAK,OACLiO,YAAY,eACZjS,MAAOwV,EAAQxV,OAAS,GACxB+Q,SAAU,SAAAN,GAAC,OAAI/E,EAAK2J,cAAcJ,EAAKxE,OAChDvQ,EAAAC,EAAAC,cAACM,EAAAP,EAAD,CAAQQ,QAAQ,UAAUC,OAAO,SAASH,QAAS,kBAAMiL,EAAKsJ,cAAcC,IAAMpU,MAAM,mBAAkBX,EAAAC,EAAAC,cAAA,QAAMC,UAAU,mEAM/H,OACGH,EAAAC,EAAAC,cAAA,WACIN,KAAK8V,iBAAiB1V,EAAAC,EAAAC,cAAA,WACvBF,EAAAC,EAAAC,cAACM,EAAAP,EAAD,CAAQM,QAASX,KAAK+U,YAAtB,wBAnEkC/T,IAAMC,oDCD9B8U,+LAYb,IAAI5R,EAAcnE,KAAKC,MAAM+V,UAAU7R,YACvC,QAAoB8F,IAAhB9F,EACF,OAAQ/D,EAAAC,EAAAC,cAAA,WAAKF,EAAAC,EAAAC,cAAA,OAAKC,UAAU,kBAAf,eAAiDH,EAAAC,EAAAC,cAAA,OAAKC,UAAU,kBAAkB4D,0CAKjG,IAAI8R,EAAQjW,KAAKC,MAAM+V,UAAU9R,KACjC,QAAc+F,IAAVgM,EACF,OAAQ7V,EAAAC,EAAAC,cAAA,WAAKF,EAAAC,EAAAC,cAAA,OAAKC,UAAU,kBAAf,SAA2CH,EAAAC,EAAAC,cAAA,OAAKC,UAAU,kBAClE0V,EAAM9H,IAAI,SAACjK,EAAMiR,GAAP,MAAe,CACtBA,EAAM,GAAK,KACXjR,EAAKU,KAAO,KAAOV,EAAKK,GAAK,kDAOvC,IAAIkE,EAAWzI,KAAKC,MAAM+V,UAAUvN,SACpC,QAAiBwB,IAAbxB,EACF,OAAQrI,EAAAC,EAAAC,cAAA,WACDmI,EAAS0F,IAAI,SAAC+H,EAASf,GAAV,OACV/U,EAAAC,EAAAC,cAAA,OAAKoB,IAAKyT,GAAK/U,EAAAC,EAAAC,cAAA,OAAKC,UAAU,kBAAf,WAAyC2V,EAAQ3R,IAASnE,EAAAC,EAAAC,cAAA,OAAKC,UAAU,kBAAkB2V,EAAQhW,4CAO9H,IAAI8V,EAAYhW,KAAKC,MAAM+V,UAC3B,OAAQ5V,EAAAC,EAAAC,cAAC6V,GAAA9V,EAAD,CAAeqB,IAAKsU,EAAUzR,GAAI6R,OAAQJ,EAAUpR,KAAMyR,OAAQL,EAAUnO,OAC5EzH,EAAAC,EAAAC,cAACgW,GAAAjW,EAAD,CAAOI,MAAO,CAAC0E,MAAO,UAAWnF,KAAKC,MAAM+V,UAAUpO,OACtDxH,EAAAC,EAAAC,cAAA,WACEF,EAAAC,EAAAC,cAAA,WAAKF,EAAAC,EAAAC,cAAA,OAAKC,UAAU,kBAAf,MAAwCH,EAAAC,EAAAC,cAAA,OAAKC,UAAU,kBAC9DH,EAAAC,EAAAC,cAAA,KAAG8L,KAAMpM,KAAKqB,KAAM2U,EAAUzR,MAC7BvE,KAAKuW,oBACLvW,KAAKwW,cACLxW,KAAKyW,+CA/Cd,IAAI/Q,EAAO,KAKX,MAHI,SADW1F,KAAKC,MAAMsF,UACA,QAASvF,KAAKC,MAAMsF,SAASG,MAAQ,OAAQ1F,KAAKC,MAAM+V,YAC9EtQ,EAAO1F,KAAKC,MAAMsF,SAASG,KAAKrE,IAAIqV,QAAQ,SAAU1W,KAAKC,MAAM+V,UAAUzR,KAExEmB,SARwB1E,IAAMC,WCHxB0V,8MACnBC,OAAS,WACP,IAAMC,EAAY7W,KAAKC,MAAMuE,SAASnD,IAAIqV,QAAQ,SAAU5G,mBAAmB9P,KAAKC,MAAMsE,KAC1F,IAAKuS,OAAOC,UAAU/W,KAAKC,MAAMuE,SAASiC,UAAYqQ,OAAOC,UAAU/W,KAAKC,MAAMuE,SAASgC,OACvF,MAAO,CAACwQ,OAAM,4FAElB,IAGI,OAFA,IAAI1V,IAAIuV,GAED,CAACG,OAAM,gBAAA/B,OAAiB4B,EAAjB,cAAA5B,OAAuCjV,KAAKC,MAAMuE,SAASiC,OAA3D,aAAAwO,OAA6EjV,KAAKC,MAAMuE,SAASgC,MAAjG,+BAChB,MAAMyQ,GACJ,MAAO,CAACD,OAAM,+IAKlB,OACC5W,EAAAC,EAAAC,cAAA,gBACuB2J,IAAlBjK,KAAKC,MAAMsE,GACZnE,EAAAC,EAAAC,cAAA,YACAF,EAAAC,EAAAC,cAAA,OAAK4W,wBAAyBlX,KAAK4W,mBApBC5V,IAAMC,WCO9BkW,oLAqCT,OAAQ/W,EAAAC,EAAAC,cAAC6V,GAAA9V,EAAD,CAAeqB,IAAK1B,KAAKC,MAAMyB,IAAK0U,OAAQpW,KAAKoX,eAC5CpX,KAAKqX,gDAnClB,IAAMxC,EAAM7U,KAAKC,MAAMC,MACvB,YAAiB+J,IAAb4K,EAAIxP,KACGwP,EAAIxP,UACO4E,IAAX4K,EAAItQ,SAAiC0F,IAAb4K,EAAIjQ,KAC5BiQ,EAAIjQ,UACQqF,IAAZ4K,EAAI3P,IACJ2P,EAAI3P,SACU+E,IAAd4K,EAAI1P,MACJ0P,EAAI1P,WACQ8E,IAAZ4K,EAAIzP,IACJyP,EAAIzP,IAEJ,6CAKX,IAAMyP,EAAM7U,KAAKC,MAAMC,MACvB,YAAiB+J,IAAb4K,EAAIxP,KACG,YACW4E,IAAX4K,EAAItQ,SAAiC0F,IAAb4K,EAAIjQ,KAC5BiQ,EAAItQ,QACQ0F,IAAZ4K,EAAI3P,IACJ,cACc+E,IAAd4K,EAAI1P,MACJ,6BACY8E,IAAZ4K,EAAIzP,IACJ,UAEA,eAhCyBpE,IAAMC,+BCKjCqW,eAEnB,SAAAA,IAAc,IAAA3M,EAAA,OAAApJ,OAAAqI,EAAA,EAAArI,CAAAvB,KAAAsX,IACV3M,EAAApJ,OAAAqJ,EAAA,EAAArJ,CAAAvB,KAAAuB,OAAAsJ,EAAA,EAAAtJ,CAAA+V,GAAAxM,KAAA9K,QASJuX,eAAiB,SAACtE,GACdtI,EAAKK,SAAS,CACV5E,OAAQ6M,EACRuE,mBAAevN,EACfwN,iBAAkB,MAdZ9M,EAkBd6K,iBAAmB,SAACvC,GAChBtI,EAAKK,SAAS,CACV1E,SAAU2M,EACVuE,mBAAevN,EACfwN,iBAAkB,MAtBZ9M,EAkDd+M,WAAa,SAAC/G,GACRA,EAAEU,iBACF1G,EAAKK,SAAS,CACN5E,YAAQ6D,EACR3D,cAAU2D,EACVuN,mBAAevN,EACfwN,sBAAkBxN,KAxDlBU,EA4DdgN,YAAc,SAAChH,GACTA,EAAEU,iBACF1G,EAAKK,SAAS,CAACwM,cAAe,aAChB7M,EAAK1K,MAAMsO,QAAQsE,YACjCC,CAAQnI,EAAKiN,oBAAqB,CAAC5V,QAAS,MACxCkJ,KAAK,SAAAvD,GAAM,OAAIA,EAAOyD,SACtBF,KAAK,SAAAvD,GAAM,OACRgD,EAAKK,SAAS,CACXwM,cAAe7P,EACf8P,iBAAkB9M,EAAKkN,wBAAwBlQ,OAGrD0D,MAAM,SAAAsF,GACJhG,EAAKK,SAAS,CACZ8M,cAAe,SACfC,YAAapH,EAAEO,aAzEzBvG,EAAKe,MAAQ,CACXtF,YAAQ6D,EACR3D,cAAU2D,EACVuN,mBAAevN,EACfwN,iBAAkB,IANV9M,gFA2BV,YAA0BV,IAAtBjK,KAAK0L,MAAMtF,aAAgD6D,IAAxBjK,KAAK0L,MAAMpF,SACvC,CACLjC,IAAK,CAACrE,KAAK0L,MAAMtF,OAAO7B,IACxBH,WAAY,CAAC,CAACG,GAAIvE,KAAK0L,MAAMpF,SAAS/B,MAGjC,+CAKX,IAAIpD,EAAUnB,KAAKC,MAAMsO,QAAQ7E,SACjC,IAAKvI,EACF,MAAO,IAEV,IAAIC,EAAS,CACXsF,OAAQsR,KAAKC,UAAUjY,KAAKkY,mBAE1B7W,EAAM,IAAIC,IAAIH,GAElB,OADAI,OAAOC,KAAKJ,GAAQK,QAAQ,SAAAC,GAAG,OAAIL,EAAIM,aAAaC,OAAOF,EAAKN,EAAOM,MAChEL,EAAIQ,oEAkCT,OAAOzB,EAAAC,EAAAC,cAAA,yDAIP,GAAiC,aAA7BN,KAAK0L,MAAM8L,cACV,OAAQpX,EAAAC,EAAAC,cAAA,OAAKC,UAAU,sBAAf,2BACN,GAAiC,WAA7BP,KAAK0L,MAAM8L,cACjB,OAAQpX,EAAAC,EAAAC,cAAA,OAAKC,UAAU,sBAAf,UAA4CP,KAAK0L,MAAMqM,aAC7D,QAAiC9N,IAA7BjK,KAAK0L,MAAM8L,oBAAqDvN,IAAtBjK,KAAK0L,MAAMtF,aAAgD6D,IAAxBjK,KAAK0L,MAAMpF,SAC9F,OAAQlG,EAAAC,EAAAC,cAAA,YAER,QAAsC2J,IAAlCjK,KAAK0L,MAAM8L,cAAc3S,KACxB,OAAQzE,EAAAC,EAAAC,cAAA,QAAMC,UAAU,sBAAhB,MAAwCH,EAAAC,EAAAC,cAAA,oBAAxC,+BAEb,QAA4D2J,IAAxDjK,KAAK0L,MAAM8L,cAAc3S,KAAK7E,KAAK0L,MAAMtF,OAAO7B,IAC/C,OAAQnE,EAAAC,EAAAC,cAAA,QAAMC,UAAU,sBAAhB,WAA6CH,EAAAC,EAAAC,cAAA,oBAAYN,KAAK0L,MAAMtF,OAAO7B,IAA3E,4BAEb,QAAoF0F,IAAhFjK,KAAK0L,MAAM8L,cAAc3S,KAAK7E,KAAK0L,MAAMtF,OAAO7B,IAAIvE,KAAK0L,MAAMpF,SAAS/B,IACvE,OAAQnE,EAAAC,EAAAC,cAAA,QAAMC,UAAU,sBAAhB,WAA6CH,EAAAC,EAAAC,cAAA,oBAAYN,KAAK0L,MAAMtF,OAAO7B,GAAIvE,KAAK0L,MAAMpF,SAAS/B,IAAnG,4BAEb,IAAM4T,EAASnY,KAAK0L,MAAM8L,cAAc3S,KAAK7E,KAAK0L,MAAMtF,OAAO7B,IAAIvE,KAAK0L,MAAMpF,SAAS/B,IACvF,OAAsB,IAAlB4T,EAAOzP,OACEtI,EAAAC,EAAAC,cAAA,QAAMC,UAAU,aAAhB,cAGVH,EAAAC,EAAAC,cAAC8X,GAAA/X,EAAD,KACI8X,EAAOhK,IAAI,SAACjO,EAAOiV,GAAR,OACP/U,EAAAC,EAAAC,cAAC+X,GAAD,CAAoBnY,MAAOA,EAAOwB,IAAK,yBAAyByT,uDAK9DhK,GACzB,IAAI9B,EAASE,EAAUvJ,KAAKC,MAAMsO,QAAQ1E,wBAAyB,2BAE5D,OADYR,EAAO8B,GAIP,GAFA9B,EAAOiP,OAAOnK,IAAI,SAAA7C,GAAK,OAAIA,EAAMiN,SAAS,IAAIjN,EAAM4F,2CAOpE,OACC9Q,EAAAC,EAAAC,cAAA,WACGF,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,GACL7R,EAAAC,EAAAC,cAACiR,EAAAlR,EAAD,CAAMmR,YAAU,GACZpR,EAAAC,EAAAC,cAACqR,GAAAtR,EAAD,CAAWuR,UAAU,uBACjBxR,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK0R,eAAgBC,KAAcC,GAAI,GAAvC,WACA7R,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,IACL7R,EAAAC,EAAAC,cAACuV,GAAD,CACItH,QAASvO,KAAKC,MAAMsO,QACpB4D,YAAY,4BACZjS,MAAOF,KAAK0L,MAAMtF,OAClB+M,YAAY,SACZlC,SAAUjR,KAAKuX,mBAG3BnX,EAAAC,EAAAC,cAACqR,GAAAtR,EAAD,CAAWuR,UAAU,yBACjBxR,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK0R,eAAgBC,KAAcC,GAAI,GAAvC,aACA7R,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,IACD7R,EAAAC,EAAAC,cAACuV,GAAD,CACItH,QAASvO,KAAKC,MAAMsO,QACpB4D,YAAY,kCACZjS,MAAOF,KAAK0L,MAAMpF,SAClB6M,YAAY,WACZlC,SAAUjR,KAAKwV,qBAG/BpV,EAAAC,EAAAC,cAACqR,GAAAtR,EAAD,CAAWuR,UAAU,eACbxR,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,KACT7R,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,GACL7R,EAAAC,EAAAC,cAACoU,GAAArU,EAAD,KACID,EAAAC,EAAAC,cAACoU,GAAArU,EAAWuU,OAAZ,KAAmBxU,EAAAC,EAAAC,cAACM,EAAAP,EAAD,CAAQM,QAASX,KAAK0X,WAAYxT,KAAK,SAASrD,QAAQ,WAAxD,UACnBT,EAAAC,EAAAC,cAACoU,GAAArU,EAAWuU,OAAZ,KAAmBxU,EAAAC,EAAAC,cAACM,EAAAP,EAAD,CAAQM,QAASX,KAAK2X,YAAazT,KAAK,SAASrD,QAAQ,WAAzD,gBAM3CT,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,GACL7R,EAAAC,EAAAC,cAACkY,GAAAnY,EAAD,CACQoY,MAAOtW,EACPuW,KAAM1Y,KAAKkY,iBACXS,cAAe,SAACzU,EAAMwU,EAAME,EAAUC,GAAvB,MAAsC,IACrDC,iBAAkB,SAACC,EAASL,EAAMM,GAAhB,OAA0B,GAC5CC,UAAU,IAClB7Y,EAAAC,EAAAC,cAAA,WACAF,EAAAC,EAAAC,cAAA,KAAG8L,KAAMpM,KAAK4X,oBAAqB7W,MAAM,mCAAmCsL,OAAO,SAASC,IAAI,uBAAhG,qCACCtM,KAAKkZ,kCAEV9Y,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,GACJjS,KAAKmZ,8BA/K4BnY,IAAMC,WCS/BmY,eACnB,SAAAA,IAAc,IAAAzO,EAAA,OAAApJ,OAAAqI,EAAA,EAAArI,CAAAvB,KAAAoZ,IACZzO,EAAApJ,OAAAqJ,EAAA,EAAArJ,CAAAvB,KAAAuB,OAAAsJ,EAAA,EAAAtJ,CAAA6X,GAAAtO,KAAA9K,QAaFqZ,mBAAqB,SAAC1I,GACpBhG,EAAKK,SAAS,CACVsO,WAAY3I,EAAE0D,cAAcnU,SAhBpByK,EAoBd4O,kBAAoB,SAAC5I,GACnBhG,EAAKK,SAAS,CACVwO,UAAW7I,EAAE0D,cAAcnU,SAtBnByK,EA0Bd8O,mBAAqB,SAACjS,GACpBmD,EAAKK,SAAS,CACV0O,gBAAiBlS,KA5BTmD,EAgCdgP,wBAA0B,SAACxB,GACzBxN,EAAKK,SAAS,CACV4O,gBAAiBzB,KAlCTxN,EAsCdkP,mBAAqB,SAAClJ,GACpBhG,EAAKK,SAAS,CACV8O,WAAYnJ,EAAE0D,cAAcnU,SAxCpByK,EA4CdoP,sBAAwB,SAAC7Z,GACvByK,EAAKK,SAAS,CACVgP,qBAA2B/P,IAAV/J,EAAsBA,EAAMqE,QAAK0F,KA9C1CU,EAoFdsP,uBAAyB,SAACtJ,IACvBA,EAAEU,iBACG1G,EAAK1K,MAAMsO,SAAY5D,EAAK1K,MAAMsO,QAAQ7E,YAG/CiB,EAAKK,SAAS,CAACkP,aAAc,aACfvP,EAAK1K,MAAMsO,QAAQsE,YACjCC,CAAQnI,EAAKiN,oBAAqB,CAAC5V,QAAS,MACxCkJ,KAAK,SAAAvD,GAAM,OAAIA,EAAOyD,SACtBF,KAAK,SAAAvD,GAAM,OACTgD,EAAKK,SAAS,CACXkP,aAAcvS,EAAOwS,GAAGxS,OACxByS,8BAA+BzP,EAAKkN,wBAAwB,8BAA+BlQ,OAEhG0D,MAAM,SAAAsF,GACHhG,EAAKK,SAAS,CACZqP,WAAY1J,EAAEO,QACdgJ,aAAc,eAlGxBvP,EAAKe,MAAQ,CACT4N,WAAY,GACZE,UAAW,UACXE,qBAAiBzP,EACjB2P,gBAAiB,GACjBE,gBAAY7P,EACZmQ,8BAA+B,GAC/BJ,qBAAkB/P,GAVVU,uFAyGUnB,EAAY2B,GACjC,IAAI9B,EAASE,EAAUvJ,KAAKC,MAAMsO,QAAQ1E,wBAAyBL,GAEnE,OADYH,EAAO8B,GAIT,GAFA9B,EAAOiP,OAAOnK,IAAI,SAAA7C,GAAK,OAAIA,EAAMiN,SAAS,IAAIjN,EAAM4F,uDAM5C,IAAAtF,EAAA5L,KAClB,MAAgC,aAA5BA,KAAK0L,MAAMwO,aACJ9Z,EAAAC,EAAAC,cAAA,OAAKC,UAAU,sBAAf,2BAC4B,WAA5BP,KAAK0L,MAAMwO,aACX9Z,EAAAC,EAAAC,cAAA,OAAKC,UAAU,sBAAf,UAA4CP,KAAK0L,MAAM2O,iBAC3BpQ,IAA5BjK,KAAK0L,MAAMwO,aACX9Z,EAAAC,EAAAC,cAAA,YAE+B,IAAnCN,KAAK0L,MAAMwO,aAAaxR,OACjBtI,EAAAC,EAAAC,cAAA,QAAMC,UAAU,aAAhB,cAGTH,EAAAC,EAAAC,cAAC8X,GAAA/X,EAAD,KACGL,KAAK0L,MAAMwO,aAAa/L,IAAI,SAAAxG,GAAM,OACjCvH,EAAAC,EAAAC,cAACga,GAAD,CAAWtE,UAAWrO,EAAQpC,SAAUqG,EAAK3L,MAAMsO,QAAQhJ,4EAQrE,OAAwD,IAApDvF,KAAK0L,MAAM0O,8BAA8B1R,OACjCtI,EAAAC,EAAAC,cAAA,YAEAF,EAAAC,EAAAC,cAACia,GAAAla,EAAD,CAAOQ,QAAQ,WACpBT,EAAAC,EAAAC,cAAA,8DACAF,EAAAC,EAAAC,cAAA,UACCN,KAAK0L,MAAM0O,8BAA8BjM,IAAI,SAAC7C,EAAO6J,GAAR,OAC3C/U,EAAAC,EAAAC,cAAA,MAAIoB,IAAKyT,GAAM7J,gEAQxB,IAAI/F,EAAWvF,KAAKC,MAAMsO,QAAQhJ,SAC9B+S,EAAStY,KAAK6X,wBAAwB,WAAYtS,GACtD,OAAsB,IAAlB+S,EAAO5P,OACAtI,EAAAC,EAAAC,cAAA,YAEAF,EAAAC,EAAAC,cAACia,GAAAla,EAAD,CAAOQ,QAAQ,WACpBT,EAAAC,EAAAC,cAAA,wDACAF,EAAAC,EAAAC,cAAA,UACMgY,EAAOnK,IAAI,SAAC7C,EAAO6J,GAAR,OACT/U,EAAAC,EAAAC,cAAA,MAAIoB,IAAKyT,GAAM7J,qDAO7B,IAAIjE,EAAQ,CACTA,MAAOrH,KAAK0L,MAAM4N,YAerB,MAb6B,gBAAzBtZ,KAAK0L,MAAM8N,gBAA8DvP,IAA/BjK,KAAK0L,MAAMgO,gBACtDrS,EAAMnD,KAAOlE,KAAK0L,MAAMgO,gBAAgBnV,GACP,YAAzBvE,KAAK0L,MAAM8N,YACnBnS,EAAMnD,KAAOlE,KAAK0L,MAAM8N,WAEvBxZ,KAAK0L,MAAMkO,gBAAgBlR,OAAS,IACrCrB,EAAMjD,WAAapE,KAAK0L,MAAMkO,gBAC1BY,OAAO,SAAAC,GAAC,YAAUxQ,IAANwQ,GAAmBA,EAAEnU,UAAYmU,EAAEva,QAC/CiO,IAAI,SAAAsM,GAAM,MAAO,CAAClT,IAAKkT,EAAEnU,SAAS/B,GAAIiD,EAAGiT,EAAEva,UAE7Cwa,MAAMC,SAAS3a,KAAK0L,MAAMoO,eAC5BzS,EAAMC,MAAQqT,SAAS3a,KAAK0L,MAAMoO,aAE9BzS,8CAIP,IAAIlG,EAAUnB,KAAKC,MAAMsO,QAAQ7E,SACjC,IAAKvI,EACF,MAAO,IAEV,IAAIC,EAAS,CACVwZ,QAAS5C,KAAKC,UAAU,CAACkC,GAAIna,KAAK6a,yBAEjCxZ,EAAM,IAAIC,IAAIH,GAElB,OADAI,OAAOC,KAAKJ,GAAQK,QAAQ,SAAAC,GAAG,OAAIL,EAAIM,aAAaC,OAAOF,EAAKN,EAAOM,MAChEL,EAAIQ,uDAGM,IAAAiP,EAAA9Q,KACd8a,EAAU9a,KAAK0L,MAAM8N,UACrBvS,EAAUjH,KAAK2F,aAAawI,IAAI,SAAA4M,GAAC,OAClC3a,EAAAC,EAAAC,cAAC0a,GAAA3a,EAAD,CACGuE,KAAK,gBACLlD,IAAK,OAAOqZ,EAAExW,GACdrE,MAAO6a,EAAExW,GACT0W,QAASH,IAAYC,EAAExW,GACvB0M,SAAUH,EAAKyI,mBAChBwB,EAAEnW,KAAKxE,EAAAC,EAAAC,cAAA,WACPwT,MAAMC,QAAQgH,EAAE/G,UAAY+G,EAAE/G,QAAQtL,QAAUtI,EAAAC,EAAAC,cAAA,QAAMC,UAAU,eAAewa,EAAE/G,QAAQ7F,IAAI,SAAAwC,GAAC,OAAIA,EAAEpM,KAAI0P,KAAK,MAA7D,OAAiF7T,EAAAC,EAAAC,cAAA,QAAMC,UAAU,eAAewa,EAAExW,OA2BvK,OAxBIvE,KAAKkb,gBACNjU,EAAQkF,KAAK/L,EAAAC,EAAAC,cAAC0a,GAAA3a,EAAD,CACXuE,KAAK,gBACLlD,IAAI,cACJxB,MAAM,cACN+a,QAAqB,gBAAZH,EACT7J,SAAUjR,KAAKuZ,mBALJ,UAOTnZ,EAAAC,EAAAC,cAAA,WACEF,EAAAC,EAAAC,cAACkU,GAAD,CACGjG,QAASvO,KAAKC,MAAMsO,QACpB4E,YAAY,OACZ5O,GAAG,4BACHrE,MAAOF,KAAK0L,MAAMgO,gBAClBzI,SAAUjR,KAAKyZ,wBAI3BxS,EAAQkF,KAAK/L,EAAAC,EAAAC,cAAC0a,GAAA3a,EAAD,CACTuE,KAAK,gBACLlD,IAAI,UACJxB,MAAM,UACN+a,QAAqB,YAAZH,EACT7J,SAAUjR,KAAKuZ,mBALN,yCAMNtS,mCAGA,IAAAqK,EAAAtR,KACP,OACGI,EAAAC,EAAAC,cAAA,WACEN,KAAKmb,iCACN/a,EAAAC,EAAAC,cAAC8a,GAAA/a,EAAD,CAAMgb,iBAAiB,YAAYC,WAAW,EAAO/W,GAAG,mBACpDnE,EAAAC,EAAAC,cAACib,GAAAlb,EAAD,CAAKmb,SAAS,YAAYza,MAAM,aAC5BX,EAAAC,EAAAC,cAAA,OAAKC,UAAU,cACfH,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,GACL7R,EAAAC,EAAAC,cAACiR,EAAAlR,EAAD,CAAMmR,YAAU,GACZpR,EAAAC,EAAAC,cAACqR,GAAAtR,EAAD,CAAWuR,UAAU,iBACjBxR,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK0R,eAAgBC,KAAcC,GAAI,GAAvC,SACA7R,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,IACL7R,EAAAC,EAAAC,cAACoU,GAAArU,EAAD,KACAD,EAAAC,EAAAC,cAAC4R,GAAA7R,EAAD,CACI6D,KAAK,OACLiO,YAAY,sBACZjS,MAAOF,KAAK0L,MAAM4N,WAClBrI,SAAUjR,KAAKqZ,qBACfjZ,EAAAC,EAAAC,cAACoU,GAAArU,EAAWuU,OAAZ,KAAmBxU,EAAAC,EAAAC,cAACM,EAAAP,EAAD,CAAQM,QAASX,KAAKia,uBAAwB/V,KAAK,SAASrD,QAAQ,UAAU4L,UAAWzM,KAAKC,MAAMsO,SAApG,iBAI/BnO,EAAAC,EAAAC,cAACqR,GAAAtR,EAAD,CAAWuR,UAAU,iBACjBxR,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK0R,eAAgBC,KAAcC,GAAI,GAAvC,SACA7R,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,IACJjS,KAAKyb,sBAGdrb,EAAAC,EAAAC,cAACqR,GAAAtR,EAAD,CAAWuR,UAAU,uBACjBxR,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK0R,eAAgBC,KAAcC,GAAI,GAAvC,eACA7R,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,IACL7R,EAAAC,EAAAC,cAACob,GAAD,CAAiBnN,QAASvO,KAAKC,MAAMsO,QAASrO,MAAOF,KAAK0L,MAAMkO,gBAAiB3I,SAAUjR,KAAK2Z,4BAGxGvZ,EAAAC,EAAAC,cAACqR,GAAAtR,EAAD,CAAWuR,UAAU,kBACjBxR,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK0R,eAAgBC,KAAcC,GAAI,GAAvC,UACA7R,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,IACT7R,EAAAC,EAAAC,cAAC4R,GAAA7R,EAAD,CACQ6D,KAAK,SACLiO,YAAY,+BACZjS,MAAOF,KAAK0L,MAAMoO,WAClB7I,SAAU,SAACzJ,GAAD,OAAO8J,EAAKuI,mBAAmBrS,UAK7DpH,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,GACL7R,EAAAC,EAAAC,cAACkY,GAAAnY,EAAD,CACQoY,MAAOtW,EACPuW,KAAM1Y,KAAK6a,sBACXlC,cAAe,SAACzU,EAAMwU,EAAME,EAAUC,GAAvB,MAAsC,IACrDC,iBAAkB,SAACC,EAASL,EAAMM,GAAhB,OAA0B,GAC5CC,UAAU,IAClB7Y,EAAAC,EAAAC,cAAA,WACAF,EAAAC,EAAAC,cAAA,KAAG8L,KAAMpM,KAAK4X,oBAAqB7W,MAAM,mCAAmCsL,OAAO,SAASC,IAAI,uBAAhG,qCACCtM,KAAK2b,uCAEVvb,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,GACJjS,KAAKmZ,wBAId/Y,EAAAC,EAAAC,cAACib,GAAAlb,EAAD,CAAKmb,SAAS,UAAUza,MAAM,WAC1BX,EAAAC,EAAAC,cAAA,OAAKC,UAAU,cACfH,EAAAC,EAAAC,cAACiR,EAAAlR,EAAD,CAAMmR,YAAU,GACZpR,EAAAC,EAAAC,cAACqR,GAAAtR,EAAD,CAAWuR,UAAU,0BACjBxR,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK0R,eAAgBC,KAAcC,GAAI,GAAvC,WACA7R,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,IACL7R,EAAAC,EAAAC,cAACkU,GAAD,CAAkBjG,QAASvO,KAAKC,MAAMsO,QAAS4E,YAAY,SAAS5O,GAAG,0BAG/EnE,EAAAC,EAAAC,cAACqR,GAAAtR,EAAD,CAAWuR,UAAU,wBACjBxR,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK0R,eAAgBC,KAAcC,GAAI,GAAvC,SACA7R,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,IACL7R,EAAAC,EAAAC,cAACkU,GAAD,CAAkBjG,QAASvO,KAAKC,MAAMsO,QAAS4E,YAAY,OAAO5O,GAAG,wBAG7EnE,EAAAC,EAAAC,cAACqR,GAAAtR,EAAD,CAAWuR,UAAU,4BACjBxR,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK0R,eAAgBC,KAAcC,GAAI,GAAvC,aACA7R,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,IACL7R,EAAAC,EAAAC,cAACkU,GAAD,CAAkBjG,QAASvO,KAAKC,MAAMsO,QAAS4E,YAAY,WAAW5O,GAAG,+BAMzFnE,EAAAC,EAAAC,cAACib,GAAAlb,EAAD,CAAKmb,SAAS,UAAUza,MAAM,UAAU0L,UAAWzM,KAAK4b,mBACxDxb,EAAAC,EAAAC,cAAA,OAAKC,UAAU,cACTP,KAAK4b,kBACLxb,EAAAC,EAAAC,cAAA,WACEF,EAAAC,EAAAC,cAACiR,EAAAlR,EAAD,CAAMmR,YAAU,GACZpR,EAAAC,EAAAC,cAACqR,GAAAtR,EAAD,CAAWuR,UAAU,0BACjBxR,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK0R,eAAgBC,KAAcC,GAAI,GAAvC,WACA7R,EAAAC,EAAAC,cAACwR,GAAAzR,EAAD,CAAK4R,GAAI,IACL7R,EAAAC,EAAAC,cAACuV,GAAD,CAActH,QAASvO,KAAKC,MAAMsO,QAAS4E,YAAY,SAAS5O,GAAG,uBAAuB+P,gBAAc,EAACrD,SAAUjR,KAAK+Z,2BAIpI3Z,EAAAC,EAAAC,cAACub,GAAD,CAAiBtX,GAAIvE,KAAK0L,MAAMsO,gBAAiBxV,SAAUxE,KAAKC,MAAMsO,QAAQhJ,SAASgB,WAExFnG,EAAAC,EAAAC,cAAA,0DAGPF,EAAAC,EAAAC,cAACib,GAAAlb,EAAD,CAAKmb,SAAS,SAASza,MAAM,SAAS0L,UAAWzM,KAAK8b,kBACtD1b,EAAAC,EAAAC,cAAA,OAAKC,UAAU,cACTP,KAAK8b,iBACH1b,EAAAC,EAAAC,cAACyb,GAAD,CAAkBxN,QAASvO,KAAKC,MAAMsO,UACvCnO,EAAAC,EAAAC,cAAA,qGAxSd,OAAIN,KAAKC,MAAMsO,SAAWvO,KAAKC,MAAMsO,QAAQhJ,UACnCvF,KAAKC,MAAMsO,QAAQhJ,SAASI,cAE5B,0CAKV,OAAQ3F,KAAKC,MAAMsO,SAClBvO,KAAKC,MAAMsO,QAAQhJ,UACnBvF,KAAKC,MAAMsO,QAAQhJ,SAASM,SAC5B7F,KAAKC,MAAMsO,QAAQhJ,SAASM,QAAQ3B,gDAIrC,OAAQlE,KAAKC,MAAMsO,SAClBvO,KAAKC,MAAMsO,QAAQhJ,UACnBvF,KAAKC,MAAMsO,QAAQhJ,SAASM,SAC5B7F,KAAKC,MAAMsO,QAAQhJ,SAASM,QAAQS,mDAIrC,OAAQtG,KAAKC,MAAMsO,SACXvO,KAAKC,MAAMsO,QAAQhJ,UACnBvF,KAAKC,MAAMsO,QAAQhJ,SAASgB,iDAIpC,OAAQvG,KAAKC,MAAMsO,SACXvO,KAAKC,MAAMsO,QAAQhJ,UACnBvF,KAAKC,MAAMsO,QAAQhJ,SAASmB,cAlFF1F,IAAMC,WCZ7C,SAAS+a,GAAThM,GAAyD,IAAjCiM,EAAiCjM,EAAjCiM,YAAaC,EAAoBlM,EAApBkM,iBAE5BxS,EAAayS,cAAbzS,SAEF6E,EAAU0N,EADdvS,EAAWA,EAAW0S,mBAAmB1S,QAAYO,GAEjDoS,EAAYjc,EAAAC,EAAAC,cAAA,YACZoJ,GAAY6E,IACb8N,EAAajc,EAAAC,EAAAC,cAACgc,GAAD,CAAW/N,QAASA,EAAS7M,IAAG,0BAGhD,IAAI6a,EAAUC,cAQd,OACCpc,EAAAC,EAAAC,cAAA,OAAKC,UAAU,cACXH,EAAAC,EAAAC,cAAA,6EACAF,EAAAC,EAAAC,cAACmc,GAAD,CACIxL,SAXU,SAAU1C,GAC1B2N,EAAiB3N,GACbA,GACFgO,EAAQpQ,KAAR,WAAA8I,OAAwBnF,mBAAmBvB,EAAQ7E,aAS/C8G,eAAgBjC,GAAW,CAAE7E,YAC7BhI,IAAKgI,IACR2S,GAIT,SAASK,GAATC,GAA+C,IAA3BC,EAA2BD,EAA3BC,iBAAkBnc,EAASkc,EAATlc,MAE/B8b,EAAUC,cAOd,OAAQpc,EAAAC,EAAAC,cAAA,OAAKC,UAAU,aAAaE,MAAOA,GACtCL,EAAAC,EAAAC,cAAA,8DAAqDF,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,6BAAR,YAArD,wCACoChM,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,sDAAR,sBADpC,kBAGAhM,EAAAC,EAAAC,cAAA,8NACAF,EAAAC,EAAAC,cAACuc,EAAD,CAAcrR,SAVA,SAAU+C,GAC1BqO,EAAiBrO,GACjBgO,EAAQpQ,KAAR,WAAA8I,OAAwBnF,mBAAmBvB,EAAQ7E,cAS7CtJ,EAAAC,EAAAC,cAAC+O,EAAD,CAAYzK,KAAK,iBAAiB8E,SAAS,uCAAuCuC,cAAc,sFAKvF6Q,eACnB,SAAAA,IAAc,IAAAnS,EAAA,OAAApJ,OAAAqI,EAAA,EAAArI,CAAAvB,KAAA8c,IACZnS,EAAApJ,OAAAqJ,EAAA,EAAArJ,CAAAvB,KAAAuB,OAAAsJ,EAAA,EAAAtJ,CAAAub,GAAAhS,KAAA9K,QAUF4c,iBAAmB,SAACrO,GAClB,IAAIwO,EAAiBxb,OAAOyb,OAAOrS,EAAKe,MAAMuQ,aAC1C1N,IACFwO,EAAexO,EAAQ7E,UAAY6E,GAErC5D,EAAKK,SAAS,CACZiS,iBAAkB1O,EAAUA,EAAQ7E,cAAWO,EAC/CgS,YAAac,EACbG,QAAS,eAnBCvS,EAuBdwS,gBAAkB,SAACzb,GAChBiJ,EAAKK,SAAS,CAAEkS,QAASxb,KAtB1BiJ,EAAKe,MAAQ,CACXuR,iBAAkB,GAClBhB,YAAa,GACbiB,QAAS,eACT7P,YAAY,EACZ+P,aAAc,IAPJzS,wEA2BL,IAAAiB,EAAA5L,KACP,OACAI,EAAAC,EAAAC,cAACgQ,EAAA,EAAD,KACElQ,EAAAC,EAAAC,cAAA,OAAKC,UAAU,MAAME,MAAO,CAAC4c,OAAQ,SACnCjd,EAAAC,EAAAC,cAAA,+CACAF,EAAAC,EAAAC,cAAA,KAAGG,MAAO,CAAC0E,MAAO,UAAU/E,EAAAC,EAAAC,cAAA,KAAG8L,KAAK,mDAAR,sBAC5BhM,EAAAC,EAAAC,cAAA,MAAIC,UAAU,gBACVH,EAAAC,EAAAC,cAACyP,EAAD,CAASE,GAAG,IAAIlP,MAAM,WAAWmP,MAAM,SACvC9P,EAAAC,EAAAC,cAACyP,EAAD,CAASE,GAAG,WAAWlP,MAAM,gBAEjCX,EAAAC,EAAAC,cAACgd,EAAA,EAAD,KACGld,EAAAC,EAAAC,cAACgd,EAAA,EAAD,CAAOlN,KAAK,qBACVhQ,EAAAC,EAAAC,cAAC0b,GAAD,CAAcC,YAAajc,KAAK0L,MAAMuQ,YAAaC,iBAAkBlc,KAAK4c,oBAE5Exc,EAAAC,EAAAC,cAACgd,EAAA,EAAD,CAAOlN,KAAK,YACVhQ,EAAAC,EAAAC,cAAC0b,GAAD,CAAcC,YAAajc,KAAK0L,MAAMuQ,YAAaC,iBAAkBlc,KAAK4c,qBAG/Exc,EAAAC,EAAAC,cAACgd,EAAA,EAAD,CAAOpN,OAAK,EAACE,KAAK,IAAImN,SAAU,SAAAC,GAAA,IAAG3V,EAAH2V,EAAG3V,MAAH,OAC9BzH,EAAAC,EAAAC,cAACoc,GAAD,CAAUE,iBAAkBhR,EAAKgR,iBAAmBnc,MAAO,CAACkV,QAAS9N,EAAQ,QAAU,sBA/ChE7G,IAAMC,WChDnBwc,QACW,cAA7BC,OAAOC,SAASC,UAEe,UAA7BF,OAAOC,SAASC,UAEhBF,OAAOC,SAASC,SAAS/V,MACvB,2DCZNgW,IAASC,OAAO1d,EAAAC,EAAAC,cAACyd,GAAD,MAASC,SAASC,eAAe,SD2H3C,kBAAmBC,WACrBA,UAAUC,cAAcC,MAAMlT,KAAK,SAAAmT,GACjCA,EAAaC","file":"static/js/main.92ce8616.chunk.js","sourcesContent":["import Ajv from 'ajv';\nimport { specSchemas } from './JsonSchemas.js';\n\n\nconst validatorAjv = new Ajv({allErrors: true});\n\n// compiled cache of all schemas involved in the specs\nconst compiledSchemas = {};\n\nfor (let [version, schemas] of Object.entries(specSchemas)) {\n\tlet compiled = {};\n\tfor (let [name, schema] of Object.entries(schemas)) {\n\t\tcompiled[name] = validatorAjv.compile(schema);\n\t}\n\tcompiledSchemas[version] = compiled;\n}\n\n/**\n * Returns the schema validator for a given version and a type of object.\n */\nexport const getSchema = (version, schemaName) => {\n\tlet actualVersion = version === null ? '0.1' : version;\n\treturn compiledSchemas[actualVersion][schemaName];\n}\n\n\n","\nimport React from 'react';\nimport Button from 'react-bootstrap/lib/Button';\n\nexport default class FeatureCell extends React.Component {\n render() {\n let glyph = '';\n let text = '';\n let color = 'inherit';\n let cellClass = 'featureCell-default';\n if (this.props.value === true) {\n glyph = 'glyphicon glyphicon-ok';\n text = 'available';\n color = 'green';\n cellClass = 'featureCell-green';\n } else if (this.props.value === false) {\n glyph = 'glyphicon glyphicon-remove';\n text = 'unavailable';\n color = '#c00000';\n cellClass = 'featureCell-red';\n } else if (this.props.value === 'checking') {\n glyph = 'glyphicon glyphicon-hourglass';\n text = 'fetching...';\n } else if (this.props.value === 'maybe') {\n glyph = 'glyphicon glyphicon-search';\n text = 'Not reachable via CORS, click to check via JSONP';\n cellClass = 'featureCell-yellow';\n }\n let span = ;\n let link = span;\n if (this.props.onClick && this.props.value === 'maybe') {\n link = \n }\n return (\n \n {link}\n \n );\n }\n}\n","\nimport fetchJsonp from 'fetch-jsonp';\n\nconst addParams = (baseUrl, params) => {\n let url = new URL(baseUrl);\n if (params) {\n Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));\n }\n return url.toString();\n}\n\nexport const fetchJsonpParams = (baseUrl, params) => {\n return fetchJsonp(addParams(baseUrl, params), {timeout: 20000});\n} \n\nexport const fetchParams = (baseUrl, params) => {\n return fetch(addParams(baseUrl, params));\n}\n\nexport const jsonTheme = {\n scheme: 'monokai',\n author: 'wimer hazenberg (http://www.monokai.nl)',\n base00: '#000000', // '#272822',\n base01: '#383830',\n base02: '#49483e',\n base03: '#75715e',\n base04: '#a59f85',\n base05: '#00ff00', //'#f8f8f2',\n base06: '#f5f4f1',\n base07: '#f9f8f5',\n base08: '#f92672',\n base09: '#fd971f',\n base0A: '#f4bf75',\n base0B: '#a6e22e',\n base0C: '#a1efe4',\n base0D: '#66d9ef',\n base0E: '#ae81ff',\n base0F: '#cc6633'\n };\n\n\n","// This file was automatically generated by utils/collect_schemas.sh\n// The schemas are stored in the reconciliation-api/specs repository.\n// If any changes to the schema should be made, please do it there instead!\n// Any local changes will be overridden by the next update.\n\nexport const specVersions = [\n\"0.1\",\n\"latest\",\n];\n\nexport const specSchemas = {\n\"0.1\": {\n\"data-extension-query\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/data-extension-query.json\",\n \"type\": \"object\",\n \"description\": \"This schema validates a data extension query\",\n \"properties\": {\n \"ids\": {\n \"type\": \"array\",\n \"description\": \"The list of entity identifiers to fetch property values from\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"properties\": {\n \"type\": \"array\",\n \"description\": \"The list of properties to fetch, with their optional configuration\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"settings\": {\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"id\"\n ]\n }\n }\n },\n \"required\": [\n \"ids\",\n \"properties\"\n ]\n}\n,\n\"data-extension-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/data-extension-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema validates a data extension response\",\n \"properties\": {\n \"meta\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n },\n \"rows\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \".*\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \".*\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"str\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"str\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"float\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"float\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"int\": {\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"int\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"date\": {\n \"type\": \"string\",\n \"description\": \"Date and time formatted in ISO format\",\n \"pattern\": \"^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\\\.[0-9]+)?(Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$\"\n }\n },\n \"required\": [\n \"date\"\n ],\n \"additionalProperties\": false\n }\n ]\n }\n }\n }\n }\n }\n }\n },\n \"required\": [\n \"rows\",\n \"meta\"\n ]\n}\n,\n\"manifest\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/manifest.json\",\n \"type\": \"object\",\n \"description\": \"This validates a service manifest, describing the features supported by the endpoint.\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"A human-readable name for the service or data source\"\n },\n \"identifierSpace\": {\n \"type\": \"string\",\n \"description\": \"A URI describing the entity identifiers used in this service\"\n },\n \"schemaSpace\": {\n \"type\": \"string\",\n \"description\": \"A URI describing the schema used in this service\"\n },\n \"view\": {\n \"type\": \"object\",\n \"properties\": {\n \"url\": {\n \"type\": \"string\",\n \"description\": \"A template to transform an entity identifier into the corresponding URI\",\n \"pattern\": \".*\\\\{\\\\{id\\\\}\\\\}.*\"\n }\n },\n \"required\": [\n \"url\"\n ]\n },\n \"defaultTypes\": {\n \"type\": \"array\",\n \"description\": \"A list of default types that are considered good generic choices for reconciliation\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n },\n \"uniqueItems\": true\n },\n \"suggest\": {\n \"type\": \"object\",\n \"description\": \"Settings for the suggest protocol, to auto-complete entities, properties and types\",\n \"definitions\": {\n \"service_definition\": {\n \"type\": \"object\",\n \"properties\": {\n \"service_url\": {\n \"type\": \"string\"\n },\n \"service_path\": {\n \"type\": \"string\"\n },\n \"flyout_service_url\": {\n \"type\": \"string\"\n },\n \"flyout_service_path\": {\n \"type\": \"string\",\n \"pattern\": \".*\\\\$\\\\{id\\\\}.*\"\n }\n },\n \"required\": []\n }\n },\n \"properties\": {\n \"entity\": {\n \"$ref\": \"#/properties/suggest/definitions/service_definition\"\n },\n \"property\": {\n \"$ref\": \"#/properties/suggest/definitions/service_definition\"\n },\n \"type\": {\n \"$ref\": \"#/properties/suggest/definitions/service_definition\"\n }\n }\n },\n \"preview\": {\n \"type\": \"object\",\n \"description\": \"Settings for the preview protocol, for HTML previews of entities\",\n \"properties\": {\n \"url\": {\n \"type\": \"string\",\n \"pattern\": \".*\\\\{\\\\{id\\\\}\\\\}.*\",\n \"description\": \"A URL pattern which transforms the entity ID into a preview URL for it\"\n },\n \"width\": {\n \"type\": \"integer\",\n \"description\": \"The width of the iframe where to include the HTML preview\"\n },\n \"height\": {\n \"type\": \"integer\",\n \"description\": \"The height of the iframe where to include the HTML preview\"\n }\n },\n \"required\": [\n \"url\",\n \"width\",\n \"height\"\n ]\n },\n \"extend\": {\n \"type\": \"object\",\n \"description\": \"Settings for the data extension protocol, to fetch property values\",\n \"properties\": {\n \"propose_properties\": {\n \"type\": \"object\",\n \"description\": \"Location of the endpoint to propose properties to fetch for a given type\",\n \"properties\": {\n \"service_url\": {\n \"type\": \"string\"\n },\n \"service_path\": {\n \"type\": \"string\"\n }\n }\n },\n \"property_settings\": {\n \"type\": \"array\",\n \"description\": \"Definition of the settings configurable by the user when fetching a property\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"Defines a numerical setting on a property\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"number\"\n ]\n },\n \"default\": {\n \"type\": \"number\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\"\n ]\n },\n {\n \"type\": \"object\",\n \"description\": \"Defines a string setting on a property\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"text\"\n ]\n },\n \"default\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\"\n ]\n },\n {\n \"type\": \"object\",\n \"description\": \"Defines a boolean setting on a property\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"checkbox\"\n ]\n },\n \"default\": {\n \"type\": \"boolean\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\"\n ]\n },\n {\n \"type\": \"object\",\n \"description\": \"Defines a setting with a fixed set of choices\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"select\"\n ]\n },\n \"default\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n },\n \"choices\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"value\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"value\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\",\n \"choices\"\n ]\n }\n ]\n }\n }\n }\n }\n },\n \"required\": [\n \"name\",\n \"identifierSpace\",\n \"schemaSpace\"\n ]\n}\n,\n\"reconciliation-query-batch\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/reconciliation-query.json\",\n \"type\": \"object\",\n \"description\": \"This schema validates the JSON serialization of any reconciliation query batch, i.e. the payload of a GET/POST to a reconciliation endpoint.\",\n \"definitions\": {\n \"property_value\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"object\",\n \"description\": \"A property value which represents another entity, for instance if it was previously reconciled itself\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n }\n ]\n }\n },\n \"patternProperties\": {\n \"^.*$\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"string\",\n \"description\": \"A string to be matched against the name of the entities\"\n },\n \"type\": {\n \"description\": \"Either a single type identifier or a list of type identifiers\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n ]\n },\n \"limit\": {\n \"type\": \"number\",\n \"description\": \"The maximum number of candidates to return\"\n },\n \"properties\": {\n \"type\": \"array\",\n \"description\": \"An optional list of property mappings to refine the query\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"pid\": {\n \"type\": \"string\",\n \"description\": \"The identifier of the property, whose values will be compared to the values supplied\"\n },\n \"v\": {\n \"description\": \"A value (or array of values) to match against the property values associated with the property on each candidate\",\n \"oneOf\": [\n {\n \"$ref\": \"#/definitions/property_value\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/property_value\"\n }\n }\n ]\n }\n },\n \"required\": [\n \"pid\",\n \"v\"\n ]\n }\n },\n \"type_strict\": {\n \"type\": \"string\",\n \"description\": \"A classification of the type matching strategy when multiple types are supplied\",\n \"enum\": [\n \"any\",\n \"should\",\n \"all\"\n ]\n }\n },\n \"required\": [\n \"query\"\n ],\n \"additionalProperties\": false\n }\n }\n}\n,\n\"reconciliation-result-batch\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/reconciliation-result-batch.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON serialization of any reconciliation result batch.\",\n \"patternProperties\": {\n \"^.*$\": {\n \"type\": \"object\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Entity identifier of the candidate\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Entity name of the candidate\"\n },\n \"score\": {\n \"type\": \"number\",\n \"description\": \"Number indicating how likely it is that the candidate matches the query\"\n },\n \"match\": {\n \"type\": \"boolean\",\n \"description\": \"Boolean value indicating whether the candiate is a certain match or not.\"\n },\n \"type\": {\n \"type\": \"array\",\n \"description\": \"Types the candidate entity belongs to\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"A type can be given by id and name\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n },\n {\n \"type\": \"string\",\n \"description\": \"Alternatively, if only a string is given, it is treated as the id\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"id\",\n \"name\",\n \"score\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n }\n }\n}\n,\n\"suggest-entities-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/suggest-entities-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON response of a suggest service for entities.\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Identifier of the suggested entity\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the suggested entity\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"An optional description which can be provided to disambiguate namesakes, providing more context.\"\n },\n \"notable\": {\n \"type\": \"array\",\n \"description\": \"Types the suggest entity belongs to\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"A type can be given by id and name\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n },\n {\n \"type\": \"string\",\n \"description\": \"Alternatively, if only a string is given, it is treated as the id\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n}\n,\n\"suggest-properties-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/suggest-properties-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON response of a suggest service for properties.\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Identifier of the suggested property\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the suggested property\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"An optional description which can be provided to disambiguate namesakes, providing more context.\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n}\n,\n\"suggest-types-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/0.1/schemas/suggest-types-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON response of a suggest service for types.\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Identifier of the suggested type\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the suggested type\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"An optional description which can be provided to disambiguate namesakes, providing more context.\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n}\n,\n},\n\"latest\": {\n\"data-extension-query\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/data-extension-query.json\",\n \"type\": \"object\",\n \"description\": \"This schema validates a data extension query\",\n \"properties\": {\n \"ids\": {\n \"type\": \"array\",\n \"description\": \"The list of entity identifiers to fetch property values from\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"properties\": {\n \"type\": \"array\",\n \"description\": \"The list of properties to fetch, with their optional configuration\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"settings\": {\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"id\"\n ]\n }\n }\n },\n \"required\": [\n \"ids\",\n \"properties\"\n ]\n}\n,\n\"data-extension-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/data-extension-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema validates a data extension response\",\n \"properties\": {\n \"meta\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n },\n \"rows\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \".*\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \".*\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"str\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"str\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"float\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"float\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"int\": {\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"int\"\n ],\n \"additionalProperties\": false\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"date\": {\n \"type\": \"string\",\n \"description\": \"Date and time formatted in ISO format\",\n \"pattern\": \"^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\\\.[0-9]+)?(Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$\"\n }\n },\n \"required\": [\n \"date\"\n ],\n \"additionalProperties\": false\n }\n ]\n }\n }\n }\n }\n }\n }\n },\n \"required\": [\n \"rows\",\n \"meta\"\n ]\n}\n,\n\"manifest\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/manifest.json\",\n \"type\": \"object\",\n \"description\": \"This validates a service manifest, describing the features supported by the endpoint.\",\n \"properties\": {\n \"versions\": {\n \"type\": \"array\",\n \"description\": \"The list of API versions supported by this service.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"contains\": {\n \"enum\": [\"0.2\"]\n }\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"A human-readable name for the service or data source\"\n },\n \"identifierSpace\": {\n \"type\": \"string\",\n \"description\": \"A URI describing the entity identifiers used in this service\"\n },\n \"schemaSpace\": {\n \"type\": \"string\",\n \"description\": \"A URI describing the schema used in this service\"\n },\n \"view\": {\n \"type\": \"object\",\n \"properties\": {\n \"url\": {\n \"type\": \"string\",\n \"description\": \"A template to transform an entity identifier into the corresponding URI\",\n \"pattern\": \".*\\\\{\\\\{id\\\\}\\\\}.*\"\n }\n },\n \"required\": [\n \"url\"\n ]\n },\n \"feature_view\": {\n \"type\": \"object\",\n \"properties\": {\n \"url\": {\n \"type\": \"string\",\n \"description\": \"A template to transform a matching feature identifier into the corresponding URI\",\n \"pattern\": \".*\\\\{\\\\{id\\\\}\\\\}.*\"\n }\n },\n \"required\": [\n \"url\"\n ]\n },\n \"defaultTypes\": {\n \"type\": \"array\",\n \"description\": \"A list of default types that are considered good generic choices for reconciliation\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n },\n \"uniqueItems\": true\n },\n \"suggest\": {\n \"type\": \"object\",\n \"description\": \"Settings for the suggest protocol, to auto-complete entities, properties and types\",\n \"definitions\": {\n \"service_definition\": {\n \"type\": \"object\",\n \"properties\": {\n \"service_url\": {\n \"type\": \"string\"\n },\n \"service_path\": {\n \"type\": \"string\"\n },\n \"flyout_service_url\": {\n \"type\": \"string\"\n },\n \"flyout_service_path\": {\n \"type\": \"string\",\n \"pattern\": \".*\\\\$\\\\{id\\\\}.*\"\n }\n },\n \"required\": []\n }\n },\n \"properties\": {\n \"entity\": {\n \"$ref\": \"#/properties/suggest/definitions/service_definition\"\n },\n \"property\": {\n \"$ref\": \"#/properties/suggest/definitions/service_definition\"\n },\n \"type\": {\n \"$ref\": \"#/properties/suggest/definitions/service_definition\"\n }\n }\n },\n \"preview\": {\n \"type\": \"object\",\n \"description\": \"Settings for the preview protocol, for HTML previews of entities\",\n \"properties\": {\n \"url\": {\n \"type\": \"string\",\n \"pattern\": \".*\\\\{\\\\{id\\\\}\\\\}.*\",\n \"description\": \"A URL pattern which transforms the entity ID into a preview URL for it\"\n },\n \"width\": {\n \"type\": \"integer\",\n \"description\": \"The width of the iframe where to include the HTML preview\"\n },\n \"height\": {\n \"type\": \"integer\",\n \"description\": \"The height of the iframe where to include the HTML preview\"\n }\n },\n \"required\": [\n \"url\",\n \"width\",\n \"height\"\n ]\n },\n \"extend\": {\n \"type\": \"object\",\n \"description\": \"Settings for the data extension protocol, to fetch property values\",\n \"properties\": {\n \"propose_properties\": {\n \"type\": \"object\",\n \"description\": \"Location of the endpoint to propose properties to fetch for a given type\",\n \"properties\": {\n \"service_url\": {\n \"type\": \"string\"\n },\n \"service_path\": {\n \"type\": \"string\"\n }\n }\n },\n \"property_settings\": {\n \"type\": \"array\",\n \"description\": \"Definition of the settings configurable by the user when fetching a property\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"Defines a numerical setting on a property\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"number\"\n ]\n },\n \"default\": {\n \"type\": \"number\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\"\n ]\n },\n {\n \"type\": \"object\",\n \"description\": \"Defines a string setting on a property\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"text\"\n ]\n },\n \"default\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\"\n ]\n },\n {\n \"type\": \"object\",\n \"description\": \"Defines a boolean setting on a property\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"checkbox\"\n ]\n },\n \"default\": {\n \"type\": \"boolean\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\"\n ]\n },\n {\n \"type\": \"object\",\n \"description\": \"Defines a setting with a fixed set of choices\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"select\"\n ]\n },\n \"default\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"help_text\": {\n \"type\": \"string\"\n },\n \"choices\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"value\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"value\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"type\",\n \"label\",\n \"name\",\n \"choices\"\n ]\n }\n ]\n }\n }\n }\n },\n \"serverLimits\": {\n \"type\": \"object\",\n \"description\": \"Resource constraints imposed by the service on clients\",\n \"properties\": {\n\t\"batchRate\": {\n \"type\": \"integer\",\n \"description\": \"The number of reconciliation query batch requests which can safely be sent to this service per second per IP address.\"\n\t},\n\t\"maxConnections\": {\n \"type\": \"integer\",\n \"description\": \"The number of TCP connections which can be concurrently kept open from a single IP address.\"\n\t}\n }\n }\n },\n \"required\": [\n \"versions\",\n \"name\",\n \"identifierSpace\",\n \"schemaSpace\"\n ]\n}\n,\n\"reconciliation-query-batch\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/reconciliation-query.json\",\n \"type\": \"object\",\n \"description\": \"This schema validates the JSON serialization of any reconciliation query batch, i.e. the payload of a GET/POST to a reconciliation endpoint.\",\n \"definitions\": {\n \"property_value\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"object\",\n \"description\": \"A property value which represents another entity, for instance if it was previously reconciled itself\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n }\n ]\n }\n },\n \"patternProperties\": {\n \"^.*$\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"string\",\n \"description\": \"A string to be matched against the name of the entities\"\n },\n \"type\": {\n \"description\": \"Either a single type identifier or a list of type identifiers\",\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n ]\n },\n \"limit\": {\n \"type\": \"number\",\n \"description\": \"The maximum number of candidates to return\"\n },\n \"properties\": {\n \"type\": \"array\",\n \"description\": \"An optional list of property mappings to refine the query\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"pid\": {\n \"type\": \"string\",\n \"description\": \"The identifier of the property, whose values will be compared to the values supplied\"\n },\n \"v\": {\n \"description\": \"A value (or array of values) to match against the property values associated with the property on each candidate\",\n \"oneOf\": [\n {\n \"$ref\": \"#/definitions/property_value\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/property_value\"\n }\n }\n ]\n }\n },\n \"required\": [\n \"pid\",\n \"v\"\n ]\n }\n },\n \"type_strict\": {\n \"type\": \"string\",\n \"description\": \"A classification of the type matching strategy when multiple types are supplied\",\n \"enum\": [\n \"any\",\n \"should\",\n \"all\"\n ]\n }\n },\n \"required\": [\n \"query\"\n ],\n \"additionalProperties\": false\n }\n }\n}\n,\n\"reconciliation-result-batch\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/reconciliation-result-batch.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON serialization of any reconciliation result batch.\",\n \"patternProperties\": {\n \"^.*$\": {\n \"type\": \"object\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Entity identifier of the candidate\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Entity name of the candidate\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"Optional description of the candidate entity\"\n },\n \"score\": {\n \"type\": \"number\",\n \"description\": \"Number indicating how likely it is that the candidate matches the query\"\n },\n \"features\": {\n \"type\": \"array\",\n \"description\": \"A list of features which can be used to derive a matching score\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"A unique string identifier for the feature\"\n },\n \"value\": {\n \"description\": \"The value of the feature for this reconciliation candidate\",\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"number\"\n }\n ]\n }\n }\n }\n },\n \"match\": {\n \"type\": \"boolean\",\n \"description\": \"Boolean value indicating whether the candiate is a certain match or not.\"\n },\n \"type\": {\n \"type\": \"array\",\n \"description\": \"Types the candidate entity belongs to\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"A type can be given by id and name\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n },\n {\n \"type\": \"string\",\n \"description\": \"Alternatively, if only a string is given, it is treated as the id\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"id\",\n \"name\",\n \"score\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n }\n }\n}\n,\n\"suggest-entities-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/suggest-entities-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON response of a suggest service for entities.\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Identifier of the suggested entity\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the suggested entity\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"An optional description which can be provided to disambiguate namesakes, providing more context.\"\n },\n \"notable\": {\n \"type\": \"array\",\n \"description\": \"Types the suggest entity belongs to\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"A type can be given by id and name\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\"\n ]\n },\n {\n \"type\": \"string\",\n \"description\": \"Alternatively, if only a string is given, it is treated as the id\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n}\n,\n\"suggest-properties-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/suggest-properties-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON response of a suggest service for properties.\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Identifier of the suggested property\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the suggested property\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"An optional description which can be provided to disambiguate namesakes, providing more context.\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n}\n,\n\"suggest-types-response\":\n{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"$id\": \"https://reconciliation-api.github.io/specs/latest/schemas/suggest-types-response.json\",\n \"type\": \"object\",\n \"description\": \"This schema can be used to validate the JSON response of a suggest service for types.\",\n \"properties\": {\n \"result\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Identifier of the suggested type\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the suggested type\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"An optional description which can be provided to disambiguate namesakes, providing more context.\"\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"result\"\n ]\n}\n,\n},\n};\n","\nimport { fetchJsonpParams, fetchParams } from './utils.js';\nimport { specVersions } from './JsonSchemas.js';\nimport { getSchema } from './JsonValidator.js';\n\nexport default class ReconciliationService {\n constructor(endpoint, manifest, cors) {\n this.endpoint = endpoint;\n this.manifest = manifest;\n this.cors = cors;\n\n // test the service's manifest against manifest schemas\n // for all known versions of the specs, in order.\n this.latestCompatibleVersion = null;\n for (var version of specVersions) {\n\t let schema = getSchema(version, 'manifest');\n\t let valid = schema(manifest);\n\t if (valid) {\n\t\tthis.latestCompatibleVersion = version;\n }\n }\n }\n\n getFetcher() {\n return this.cors ? fetchParams : fetchJsonpParams;\n }\n}\n\n\n","\nimport React from 'react';\nimport Button from 'react-bootstrap/lib/Button';\nimport FeatureCell from './FeatureCell.js';\nimport fetchJsonp from 'fetch-jsonp';\nimport ReconciliationService from './ReconciliationService.js';\n\nexport default class FeatureRow extends React.Component {\n constructor() {\n super();\n this.state = {\n reacheableCORS: 'checking',\n reacheableJSONP: 'maybe',\n manifest: {},\n }; \n }\n\n componentDidMount() {\n fetch(this.props.endpoint, { timeout: 5000 })\n .then(response => response.json())\n .then(response => this.setState({manifest: response, reacheableCORS: true}))\n .catch(error => {\n this.setState({reacheableCORS: false});\n });\n if (this.props.jsonp) {\n this.checkJsonp();\n }\n }\n\n checkJsonp = () => {\n this.setState({reacheableJSONP: 'checking'});\n fetchJsonp(this.props.endpoint)\n .then(response => response.json())\n .then(response => this.setState({manifest: response, reacheableJSONP: true}))\n .catch(error => this.setState({reacheableJSONP: false}));\n }\n\n suggestSettings() {\n return this.state.manifest.suggest || {};\n }\n\n get isReacheable() {\n return this.state.reacheableCORS === true || this.state.reacheableJSONP === true;\n }\n \n hasView() {\n if (!this.isReacheable)\n return null;\n return 'url' in (this.state.manifest.view || {});\n }\n\n hasSuggestEntity() {\n if (!this.isReacheable)\n return null;\n return 'entity' in this.suggestSettings();\n }\n\n hasSuggestProperty() {\n if (!this.isReacheable)\n return null;\n return 'property' in this.suggestSettings();\n }\n\n hasSuggestType() {\n if (!this.isReacheable)\n return null;\n return 'type' in this.suggestSettings();\n }\n\n hasPreview() {\n if (!this.isReacheable)\n return null;\n return 'preview' in this.state.manifest;\n }\n\n hasExtend() {\n if (!this.isReacheable)\n return null;\n return 'extend' in this.state.manifest;\n }\n\n reconciliationService() {\n return new ReconciliationService(this.props.endpoint, this.state.manifest, this.state.reacheableCORS);\n }\n\n nameCell() {\n let parts = [\n {this.props.name}\n ];\n if (this.props.documentation && !this.props.source_url) {\n parts.push( (docs));\n }\n if (this.props.documentation && this.props.source_url) {\n parts.push( (docs, source));\n }\n if (!this.props.documentation && this.props.source_url) {\n parts.push( (source));\n }\n if (this.props.wd_uri) {\n parts.push(\n \n \n \n );\n }\n return parts;\n }\n\n triggerOnSelect = () => {\n if (this.props.onSelect) {\n this.props.onSelect(this.reconciliationService());\n }\n }\n\n render() {\n return (\n \n {this.nameCell()}\n {' '}{this.props.endpoint}\n\t {this.reconciliationService().latestCompatibleVersion || '?'}\n \n \n \n \n \n \n \n \n );\n }\n}\n\n","import React from 'react';\nimport Table from 'react-bootstrap/lib/Table';\nimport Modal from 'react-bootstrap/lib/Modal';\nimport Button from 'react-bootstrap/lib/Button';\nimport FeatureRow from './FeatureRow.js';\n\nclass Row {\n constructor(endpoint, name, documentation, source_url, wd_uri) {\n this.endpoint = endpoint;\n this.name = name;\n this.documentation = documentation;\n this.source_url = source_url;\n this.wd_uri = wd_uri;\n this.jsonp = false;\n }\n\n useJsonp() {\n this.jsonp = true;\n }\n}\n\n\nexport default class FeatureTable extends React.Component {\n constructor() {\n super();\n this.state = {\n services: [],\n showAddServiceDialog: false,\n refreshing: false,\n };\n\n this.sparql_query = (\n \"SELECT ?service ?serviceLabel ?endpoint ?documentation ?source WHERE {\\n\" +\n \" ?service p:P6269 ?statement.\\n\"+\n \" ?statement ps:P6269 ?endpoint ;\\n\"+\n \" pq:P2700 wd:Q64490175.\\n\"+\n \" OPTIONAL { ?statement (pq:P973 | pq:P2078) ?documentation }\\n\" +\n \" OPTIONAL { ?statement pq:P1324 ?source }\\n\" +\n \" FILTER NOT EXISTS { ?statement wikibase:rank wikibase:DeprecatedRank }\\n\" +\n \" SERVICE wikibase:label { bd:serviceParam wikibase:language \\\"[AUTO_LANGUAGE],en\\\". }\\n\" +\n \"}\\n\" +\n \"ORDER BY DESC(?endpoint)\\n\");\n }\n\n refreshServicesFromWD = (method) => {\n this.setState({\n refreshing: true\n });\n let url = new URL(\"https://query.wikidata.org/sparql\");\n let params = {query:this.sparql_query, format: 'json'};\n let promise = null;\n if (method === 'GET') {\n Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));\n promise = fetch(url);\n } else {\n var urlParams = new URLSearchParams();\n Object.keys(params).forEach(key => urlParams.append(key, params[key]));\n promise = fetch(url, {\n method: 'POST',\n mode: 'cors',\n cache: 'no-cache',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: urlParams,\n });\n }\n\n promise\n .then(result => result.json())\n .then(result =>\n this.setState({\n services: result.results.bindings.map(entry =>\n new Row(entry.endpoint.value, entry.serviceLabel.value,\n 'documentation' in entry ? entry.documentation.value : undefined,\n 'source' in entry ? entry.source.value : undefined,\n entry.service.value)),\n refreshing: false\n })\n )\n .catch(error => {\n console.log(error);\n this.setState({ refreshing: false });\n });\n }\n\n componentDidMount() {\n this.refreshServicesFromWD('GET');\n }\n\n loadAllJsonp = () => {\n this.setState({\n services: this.state.services.map(row => { row.useJsonp(); return row })\n });\n }\n\n openAddServiceDialog = () => {\n this.setState({\n showAddServiceDialog: true\n });\n }\n\n closeAddServiceDialog = () => {\n this.setState({\n showAddServiceDialog: false\n });\n }\n\n get sparqlQueryUrl() {\n return 'https://query.wikidata.org/#'+encodeURIComponent(this.sparql_query);\n }\n\n render() {\n return (\n <>\n

    Due to a security risk inherent to JSONP, only endpoints supporting CORS are loaded by default. You can click the{' '}\n button in each row to attempt to load the service via JSONP.\n Note that a malicious endpoint could use JSONP to execute arbitrary JavaScript code in this page. If you trust all the reconciliation services listed here, you can also .\n

    \n \n \n \n \n \n\t \n \n \n \n \n \n \n \n \n \n \n \n {this.state.services.map(\n row => )\n }\n \n
    NameEndpointAPI versionCORSJSONPView entitiesSuggest entitiesSuggest typesSuggest propertiesPreview entitiesExtend data
    \n    \n \n\n \n \n How to add a service to this list\n \n \n

    \n This list is generated by a SPARQL query on Wikidata.\n To add your service to it, follow these steps:\n

    \n \n
    \n
    \n \n );\n }\n}\n","import React from 'react';\nimport { Link, useRouteMatch } from 'react-router-dom';\n\nexport default function TabLink({ to, title, exact }) {\n const isActive = useRouteMatch({path: to, exact: exact});\n const className = isActive ? 'active' : '';\n\n return (\n
  • \n \n {title}\n \n
  • );\n}\n\n","\nimport React from 'react';\nimport Form from 'react-bootstrap/lib/Form';\nimport FormGroup from 'react-bootstrap/lib/FormGroup';\nimport FormControl from 'react-bootstrap/lib/FormControl';\nimport ControlLabel from 'react-bootstrap/lib/ControlLabel';\nimport HelpBlock from 'react-bootstrap/lib/HelpBlock';\nimport Col from 'react-bootstrap/lib/Col';\nimport fetchJsonp from 'fetch-jsonp';\nimport ReconciliationService from './ReconciliationService.js';\n\nexport default class ReconciliationServiceInput extends React.Component {\n\n state = {\n service: this.props.initialService\n };\n\n componentWillMount() {\n this.timer = null;\n }\n\n componentDidMount() {\n console.log('hey do we need to validate');\n console.log(this.props.initialService);\n if (this.props.initialService.endpoint && !this.props.initialService.manifest) {\n console.log('validating endpoint at start');\n this.validateEndpoint();\n }\n }\n\n setService(service) {\n this.setState({\n\tservice: service\n });\n }\n\n handleChange(e) {\n clearTimeout(this.timer);\n\n this.setState({\n\tservice: new ReconciliationService(e.target.value, undefined, undefined),\n error: undefined\n });\n \n this.timer = setTimeout(() => this.validateEndpoint(), 1000);\n }\n\n validateEndpoint() {\n let endpoint = this.state.service.endpoint;\n fetch(endpoint)\n .then(result => result.json())\n .then(result => this._setService(endpoint, result, true))\n .catch(e =>\n\t fetchJsonp(endpoint)\n\t .then(result => result.json())\n\t .then(result => this._setService(endpoint, result, false))\n\t .catch(e => this._setError(endpoint, e)));\n }\n\n _setService(endpoint, manifest, cors) {\n if(this.state.service.endpoint === endpoint) {\n\tlet service = new ReconciliationService(endpoint, manifest, cors);\n this.setState({\n\t service: service \n });\n if(this.props.onChange !== undefined) {\n this.props.onChange(service);\n }\n }\n }\n\n _setError(endpoint, error) {\n if(this.state.service.endpoint === endpoint) {\n this.setState({manifest: undefined, error: error})\n if(this.props.onChange !== undefined) {\n this.props.onChange(undefined, undefined);\n }\n }\n }\n \n getValidationState() {\n if (this.state.service !== undefined && this.state.service.manifest !== undefined) {\n return 'success';\n } else if(this.state.error !== undefined) {\n return 'error';\n }\n return null;\n }\n\n getMessage() {\n let message = '';\n if (this.getValidationState() === 'error') {\n message = 'The endpoint MUST return a JSON document describing the service, accessible vîa CORS or JSONP.';\n let endpoint = this.state.service.endpoint;\n if (endpoint !== undefined && (\n endpoint.startsWith('http://')\n && !endpoint.startsWith('http://localhost')\n && !endpoint.startsWith('http://127.0.0.1'))) {\n message += ' The endpoint SHOULD be available over HTTPS. Depending on your browser, this test bench might not be able to test reconciliation services over HTTP.';\n }\n return message;\n }\n }\n\n handleSubmit(e) {\n clearTimeout(this.timer);\n this.validateEndpoint();\n e.preventDefault();\n }\n\n render() {\n return (\n
    this.handleSubmit(e)}>\n \n Endpoint:\n \n this.handleChange(e)}/>\n \n {this.getMessage()}\n \n \n
    \n );\n }\n}\n","import React from 'react';\nimport {AsyncTypeahead} from 'react-bootstrap-typeahead';\n\nexport default class ReconcileSuggest extends React.Component {\n constructor() {\n super();\n this.state = {\n value: undefined,\n suggestions: [],\n isLoading: false,\n };\n }\n\n getValue() {\n if (this.props.onChange !== undefined) {\n return this.props.value;\n } else {\n return this.state.value;\n }\n }\n\n get manifest() {\n if (!this.props.service) {\n\t return null;\n } else {\n\t return this.props.service.manifest;\n }\n }\n\n getUrl() {\n if (!this.manifest || !this.manifest.suggest) {\n return null;\n }\n let configuration = this.manifest.suggest[this.props.entityClass];\n if (!configuration) {\n return null;\n }\n return configuration.service_url + configuration.service_path;\n }\n\n onSuggestionsFetchRequested = (value) => {\n let url = this.getUrl();\n let params = {'prefix':value};\n if (url === null) {\n return;\n }\n this.setState({isLoading: true});\n let fetcher = this.props.service.getFetcher();\n fetcher(url, params)\n .then(result => result.json())\n .then(result => {\n this.setState({suggestions: result.result, isLoading: false})})\n .catch(e => {\n console.log(e);\n this.setState({isLoading: false});\n });\n };\n\n onSuggestionsClearRequested = () => {\n this.setState({suggestions:[]});\n };\n\n onChange = (newValue) => {\n if (this.props.onChange === undefined) {\n this.setState({\n value: newValue[0]\n });\n } else {\n this.props.onChange(newValue[0]);\n }\n };\n\n render() {\n return (\n true}\n selected={this.getValue() ? [this.getValue()] : []}\n onChange={this.onChange}\n renderMenuItemChildren={(option, props, index) => \n <>\n {option.id}\n {Array.isArray(option.broader) && option.broader.length && {option.broader.map(e => e.id).join(', ')} > }\n {option.name}
    \n {option.description}\n \n }\n />\n );\n }\n}\n\n","import React from 'react';\nimport Button from 'react-bootstrap/lib/Button';\nimport InputGroup from 'react-bootstrap/lib/InputGroup';\nimport FormControl from 'react-bootstrap/lib/FormControl';\nimport ReconcileSuggest from './ReconcileSuggest.js';\n\n/**\n * An input which can either have autocompletion enabled\n * (thanks to a suggest service) or be a simple,\n * blank input (without autocompletion) if that is not\n * available from the service.\n */\nexport default class GenericInput extends React.Component {\n constructor() {\n super();\n this.state = {\n value: undefined\n }\n }\n\n getValue() {\n if (this.props.onChange !== undefined) {\n return this.props.value;\n } else {\n return this.state.value;\n }\n }\n\n get manifest() {\n if (!this.props.service) {\n return null;\n } else {\n return this.props.service.manifest;\n }\n }\n\n get placeholder() {\n return this.props.entityClass + ' id'\n }\n\n get currentValue() {\n if (this.props.onChange === undefined) {\n return this.state.value;\n } else {\n return this.props.value || this.state.value;\n }\n }\n\n get currentId() {\n let val = this.currentValue;\n return val === undefined ? undefined : val.id;\n }\n\n get hasAutocomplete() {\n return (this.manifest && this.manifest.suggest && this.manifest.suggest[this.props.entityClass]);\n }\n\n onSuggestChange = (newValue) => {\n this.setState({ value: newValue });\n if (this.props.onChange !== undefined) {\n this.props.onChange(newValue);\n }\n }\n\n onIdChange = (e) => {\n let newValue = {\n id: e.currentTarget.value,\n name: e.currentTarget.value\n };\n if (this.props.onChange === undefined) {\n this.setState({ value: newValue });\n } else if (this.props.explicitSubmit === undefined) {\n this.props.onChange(newValue);\n } else {\n this.setState({ value: newValue });\n }\n } \n\n onSubmit = (e) => {\n this.props.onChange(this.state.value);\n e.preventDefault();\n }\n\n render() {\n return (this.hasAutocomplete ?\n ()\n : (\n (this.props.explicitSubmit !== undefined ?\n \n \n \n \n \n \n : \n \n\n )\n ));\n }\n}\n","\nimport React from 'react';\nimport FormControl from 'react-bootstrap/lib/FormControl';\nimport Button from 'react-bootstrap/lib/Button';\nimport GenericInput from './GenericInput.js';\n\nexport default class PropertyMapping extends React.Component {\n\n newMapping = () => {\n this.emitChange(\n this.props.value.concat([{\n property: undefined,\n value: '',\n }])\n );\n }\n\n deleteMapping = (idx) => {\n let newArray = this.props.value.slice();\n newArray.splice(idx, 1);\n this.emitChange(newArray);\n }\n\n onValueChange = (idx, e) => {\n let newArray = this.props.value.slice();\n let {property} = newArray[idx];\n newArray[idx] = {property, value: e.currentTarget.value};\n this.emitChange(newArray);\n }\n\n onPropertyChange = (idx, propertyValue) => {\n console.log('new property value');\n console.log(idx);\n console.log(propertyValue);\n let newArray = this.props.value.slice();\n let {value} = newArray[idx];\n newArray[idx] = {property:propertyValue, value};\n console.log(newArray);\n this.emitChange(newArray);\n }\n\n emitChange(newValue) {\n if (this.props.onChange) {\n this.props.onChange(newValue);\n }\n }\n\n renderMappings() {\n return this.props.value.map((mapping, idx) =>\n
    \n
    \n this.onPropertyChange(idx, v)} />\n
    \n
    \n this.onValueChange(idx, e)} />
    \n \n
    \n );\n }\n\n render() {\n return (\n
    \n {this.renderMappings()}
    \n \n
    \n );\n }\n}\n","\nimport React from 'react';\nimport Badge from 'react-bootstrap/lib/Badge';\nimport ListGroupItem from 'react-bootstrap/lib/ListGroupItem';\n\nexport default class Candidate extends React.Component {\n\n get url() {\n let view = null;\n let manifest = this.props.manifest;\n if ('view' in manifest && 'url' in this.props.manifest.view && 'id' in this.props.candidate) {\n view = this.props.manifest.view.url.replace('{{id}}', this.props.candidate.id);\n }\n return view;\n }\n\n renderDescription() {\n let description = this.props.candidate.description;\n if (description !== undefined) {\n return (
    Description
    {description}
    );\n }\n }\n\n renderTypes() {\n let types = this.props.candidate.type;\n if (types !== undefined) {\n return (
    Types
    \n {types.map((type, idx) => [\n idx > 0 && \", \",\n type.name + ' (' + type.id + ')'\n ])}\n
    );\n }\n }\n\n renderFeatures() {\n let features = this.props.candidate.features;\n if (features !== undefined) {\n return (
    \n {features.map((feature, idx) => \n (
    Feature {feature.id}
    {feature.value}
    )\n )}\n
    );\n }\n }\n\n render() {\n let candidate = this.props.candidate;\n return (\n {this.props.candidate.score}\n
    \n \n {this.renderDescription()}\n {this.renderTypes()}\n {this.renderFeatures()}\n
    \n
    );\n }\n}\n","import React from 'react';\n\nexport default class PreviewRenderer extends React.Component {\n iframe = function() {\n const iframeUrl = this.props.settings.url.replace('{{id}}', encodeURIComponent(this.props.id));\n if (!Number.isInteger(this.props.settings.height) || !Number.isInteger(this.props.settings.width)) {\n return {__html:`

    The manifest must provide the width and height of the preview iframe as integers.

    `};\n }\n try {\n new URL(iframeUrl);\n // we have a valid URL\n return {__html:``};\n } catch(_) {\n return {__html:`

    Invalid URL generated by the preview service URL template.

    `};\n }\n }\n\n render() {\n return (\n
    \n {(this.props.id === undefined ?\n
    :\n
    \n )}\n
    \n );\n }\n}\n\n","\n\nimport React from 'react';\nimport ListGroupItem from 'react-bootstrap/lib/ListGroupItem';\n\n/**\n * Renders a value returned by a data extension service\n * to a list item.\n */\nexport default class DataExtensionValue extends React.Component {\n\n get renderedValue() {\n const val = this.props.value;\n if (val.date !== undefined) {\n return val.date;\n } else if (val.id !== undefined && val.name !== undefined) {\n return val.name;\n } else if (val.str !== undefined) {\n return val.str;\n } else if (val.float !== undefined) {\n return val.float;\n } else if (val.int !== undefined) {\n return val.int;\n } else {\n return 'Singleton';\n }\n }\n\n get datatype() {\n const val = this.props.value;\n if (val.date !== undefined) {\n return 'date';\n } else if (val.id !== undefined && val.name !== undefined) {\n return val.id;\n } else if (val.str !== undefined) {\n return 'string';\n } else if (val.float !== undefined) {\n return 'floating-point number';\n } else if (val.int !== undefined) {\n return 'integer';\n } else {\n return 'empty';\n }\n }\n\n render() {\n return (\n {this.datatype}\n );\n }\n}\n","import React from 'react';\nimport Form from 'react-bootstrap/lib/Form';\nimport FormGroup from 'react-bootstrap/lib/FormGroup';\nimport InputGroup from 'react-bootstrap/lib/InputGroup';\nimport Button from 'react-bootstrap/lib/Button';\nimport Col from 'react-bootstrap/lib/Col';\nimport ControlLabel from 'react-bootstrap/lib/ControlLabel';\nimport ListGroup from 'react-bootstrap/lib/ListGroup';\nimport GenericInput from './GenericInput.js';\nimport DataExtensionValue from './DataExtensionValue.js';\nimport JSONTree from 'react-json-tree';\nimport {jsonTheme} from './utils.js';\nimport { getSchema } from './JsonValidator.js';\n\nexport default class DataExtensionTab extends React.Component {\n\n constructor() {\n super();\n this.state = {\n entity: undefined,\n property: undefined,\n extendResults: undefined,\n validationErrors: []\n };\n }\n\n onEntityChange = (newValue) => {\n this.setState({\n entity: newValue,\n extendResults: undefined,\n validationErrors: []\n });\n }\n\n onPropertyChange = (newValue) => {\n this.setState({\n property: newValue,\n extendResults: undefined,\n validationErrors: []\n });\n }\n\n formulateQuery() {\n if (this.state.entity !== undefined && this.state.property !== undefined) {\n return {\n ids: [this.state.entity.id],\n properties: [{id: this.state.property.id}]\n };\n } else {\n return {};\n }\n }\n\n formulateQueryUrl() {\n let baseUrl = this.props.service.endpoint;\n if (!baseUrl) {\n return '#';\n }\n let params = {\n extend: JSON.stringify(this.formulateQuery())\n };\n let url = new URL(baseUrl);\n Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));\n return url.toString();\n }\n\n resetQuery = (e) => {\n e.preventDefault();\n this.setState({\n entity: undefined,\n property: undefined,\n extendResults: undefined,\n validationErrors: undefined\n });\n }\n\n submitQuery = (e) => {\n e.preventDefault();\n this.setState({extendResults: 'fetching'});\n let fetcher = this.props.service.getFetcher();\n fetcher(this.formulateQueryUrl(), {timeout: 20000})\n .then(result => result.json())\n .then(result =>\n this.setState({\n extendResults: result,\n validationErrors: this.validateServiceResponse(result)\n })\n )\n .catch(e => {\n this.setState({\n exdentResults: 'failed',\n extendError: e.message\n });\n });\n }\n\n renderResponseValidationErrors() {\n return
    ;\n }\n\n renderQueryResults() {\n if (this.state.extendResults === 'fetching') {\n return (
    Querying the service...
    );\n } else if (this.state.extendResults === 'failed') {\n return (
    Error: {this.state.extendError}
    );\n } else if (this.state.extendResults === undefined || this.state.entity === undefined || this.state.property === undefined) {\n return (
    );\n } else {\n if (this.state.extendResults.rows === undefined) {\n return (No rows attribute in the response.);\n }\n if (this.state.extendResults.rows[this.state.entity.id] === undefined) {\n return (Missing rows.{this.state.entity.id} object in the response.);\n }\n if (this.state.extendResults.rows[this.state.entity.id][this.state.property.id] === undefined) {\n return (Missing rows.{this.state.entity.id}{this.state.property.id} object in the response.);\n }\n const values = this.state.extendResults.rows[this.state.entity.id][this.state.property.id];\n if (values.length === 0) {\n return (No results);\n }\n return (\n \n {values.map((value, idx) =>\n )}\n );\n }\n }\n\n validateServiceResponse(response) {\n\tlet schema = getSchema(this.props.service.latestCompatibleVersion, 'data-extension-response'); \n let valid = schema(response);\n if (!valid) {\n return schema.errors.map(error => error.dataPath+' '+error.message);\n } else {\n return [];\n }\n }\n\n render() {\n return (\n
    \n \n
    \n \n Entity:\n \n \n \n \n \n Property:\n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n \n \n ''}\n shouldExpandNode={(keyName, data, level) => true}\n hideRoot={true} />\n
    \n View query results on the service\n {this.renderResponseValidationErrors()}\n \n \n {this.renderQueryResults()}\n \n\n
    \n );\n }\n}\n\n","import React from 'react';\nimport Alert from 'react-bootstrap/lib/Alert';\nimport Tabs from 'react-bootstrap/lib/Tabs';\nimport Tab from 'react-bootstrap/lib/Tab';\nimport Form from 'react-bootstrap/lib/Form';\nimport FormGroup from 'react-bootstrap/lib/FormGroup';\nimport InputGroup from 'react-bootstrap/lib/InputGroup';\nimport FormControl from 'react-bootstrap/lib/FormControl';\nimport Radio from 'react-bootstrap/lib/Radio';\nimport Button from 'react-bootstrap/lib/Button';\nimport Col from 'react-bootstrap/lib/Col';\nimport ControlLabel from 'react-bootstrap/lib/ControlLabel';\nimport ListGroup from 'react-bootstrap/lib/ListGroup';\nimport ReconcileSuggest from './ReconcileSuggest.js';\nimport PropertyMapping from './PropertyMapping.js';\nimport Candidate from './Candidate.js';\nimport GenericInput from './GenericInput.js';\nimport PreviewRenderer from './PreviewRenderer.js';\nimport DataExtensionTab from './DataExtensionTab.js';\nimport JSONTree from 'react-json-tree';\nimport { getSchema } from './JsonValidator.js';\nimport { jsonTheme } from './utils.js';\n\nexport default class TestBench extends React.Component {\n constructor() {\n super();\n\n this.state = {\n reconQuery: '',\n reconType: 'no-type',\n reconCustomType: undefined,\n reconProperties: [],\n reconLimit: undefined,\n reconResponseValidationErrors: [],\n previewEntityId : undefined\n };\n }\n\n onReconQueryChange = (e) => {\n this.setState({\n reconQuery: e.currentTarget.value\n });\n }\n\n onReconTypeChange = (e) => {\n this.setState({\n reconType: e.currentTarget.value\n });\n }\n\n onCustomTypeChange = (v) => {\n this.setState({\n reconCustomType: v\n });\n }\n\n onReconPropertiesChange = (values) => {\n this.setState({\n reconProperties: values\n });\n }\n\n onReconLimitChange = (e) => {\n this.setState({\n reconLimit: e.currentTarget.value\n });\n }\n\n onPreviewEntityChange = (value) => {\n this.setState({\n previewEntityId: value !== undefined ? value.id : undefined\n });\n };\n\n get defaultTypes() {\n if (this.props.service && this.props.service.manifest) {\n return this.props.service.manifest.defaultTypes || [];\n } else {\n return [];\n }\n }\n\n get hasTypeSuggest() {\n return (this.props.service &&\n\t this.props.service.manifest &&\n\t this.props.service.manifest.suggest &&\n\t this.props.service.manifest.suggest.type);\n }\n\n get hasPropertySuggest() {\n return (this.props.service &&\n\t this.props.service.manifest &&\n\t this.props.service.manifest.suggest &&\n\t this.props.service.manifest.suggest.property);\n }\n\n get hasPreviewService() {\n return (this.props.service &&\n this.props.service.manifest &&\n this.props.service.manifest.preview);\n } \n\n get hasDataExtension() {\n return (this.props.service &&\n this.props.service.manifest &&\n this.props.service.manifest.extend);\n }\n\n onSubmitReconciliation = (e) => {\n e.preventDefault();\n if (!this.props.service || !this.props.service.endpoint) {\n return;\n }\n this.setState({reconResults: 'fetching'});\n let fetcher = this.props.service.getFetcher();\n fetcher(this.formulateQueryUrl(), {timeout: 20000})\n .then(result => result.json())\n .then(result =>\n this.setState({\n reconResults: result.q0.result,\n reconResponseValidationErrors: this.validateServiceResponse('reconciliation-result-batch', result)\n }))\n .catch(e => {\n this.setState({\n reconError: e.message,\n reconResults: 'failed',\n })});\n }\n\n validateServiceResponse(schemaName, response) {\n let schema = getSchema(this.props.service.latestCompatibleVersion, schemaName);\n let valid = schema(response);\n if (!valid) {\n return schema.errors.map(error => error.dataPath+' '+error.message);\n } else {\n return [];\n }\n }\n\n renderQueryResults() {\n if (this.state.reconResults === 'fetching') {\n return (
    Querying the service...
    );\n } else if (this.state.reconResults === 'failed') {\n return (
    Error: {this.state.reconError}
    );\n } else if (this.state.reconResults === undefined) {\n return (
    );\n } else {\n if (this.state.reconResults.length === 0) {\n return (No results);\n }\n return (\n \n {this.state.reconResults.map(result =>\n \n )}\n \n );\n }\n }\n\n renderReconResponseValidationErrors() {\n if (this.state.reconResponseValidationErrors.length === 0) {\n return (
    );\n } else {\n return (\n Validations error for reconcilation response\n
      \n {this.state.reconResponseValidationErrors.map((error, idx) => \n
    • {error}
    • \n )}\n
    \n
    );\n }\n }\n\n renderManifestValidationErrors() {\n let manifest = this.props.service.manifest;\n let errors = this.validateServiceResponse('manifest', manifest);\n if (errors.length === 0) {\n return (
    );\n } else {\n return (\n Validation errors for service manifest\n
      \n {errors.map((error, idx) =>\n (
    • {error}
    • ))}\n
    \n
    );\n }\n }\n\n formulateReconQuery() {\n let query = {\n query: this.state.reconQuery,\n };\n if (this.state.reconType === 'custom-type' && this.state.reconCustomType !== undefined) {\n query.type = this.state.reconCustomType.id;\n } else if (this.state.reconType !== 'no-type') {\n query.type = this.state.reconType;\n }\n if (this.state.reconProperties.length > 0) {\n query.properties = this.state.reconProperties\n .filter(m => m !== undefined && m.property && m.value)\n .map(m => {return {pid: m.property.id, v: m.value}})\n }\n if (!isNaN(parseInt(this.state.reconLimit))) {\n query.limit = parseInt(this.state.reconLimit);\n }\n return query;\n }\n\n formulateQueryUrl() {\n let baseUrl = this.props.service.endpoint;\n if (!baseUrl) {\n return '#';\n }\n let params = {\n queries: JSON.stringify({q0: this.formulateReconQuery()})\n };\n let url = new URL(baseUrl);\n Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));\n return url.toString();\n }\n\n renderTypeChoices() {\n let current = this.state.reconType;\n let choices = this.defaultTypes.map(t =>\n \n {t.name}
    \n {Array.isArray(t.broader) && t.broader.length && {t.broader.map(e => e.id).join(', ')} > }{t.id}\n \n );\n if (this.hasTypeSuggest) {\n choices.push(\n Custom:\n
    \n \n
    \n );\n }\n choices.push(Reconcile against no particular type);\n return choices;\n }\n\n render() {\n return (\n
    \n {this.renderManifestValidationErrors()}\n \n \n
    \n \n
    \n \n Name:\n \n \n \n \n \n \n \n \n Type:\n \n {this.renderTypeChoices()}\n \n \n \n Properties:\n \n \n \n \n \n Limit:\n \n this.onReconLimitChange(v)} />\n \n \n
    \n \n \n ''}\n shouldExpandNode={(keyName, data, level) => true}\n hideRoot={true} />\n
    \n View query results on the service\n {this.renderReconResponseValidationErrors()}\n \n \n {this.renderQueryResults()}\n \n
    \n
    \n \n
    \n
    \n \n Entity:\n \n \n \n \n \n Type:\n \n \n \n \n \n Property:\n \n \n \n \n
    \n
    \n
    \n \n
    \n {(this.hasPreviewService ?\n
    \n
    \n \n Entity:\n \n \n \n \n
    \n \n
    \n :

    Previewing is not supported by the service.

    )}\n
    \n
    \n \n
    \n {(this.hasDataExtension ?\n \n :

    Data extension is not supported by the service.

    )}\n
    \n
    \n
    \n
    \n );\n }\n}\n","import React from 'react';\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport './style.css';\nimport FeatureTable from './FeatureTable.js';\nimport FeatureRow from './FeatureRow.js';\nimport TabLink from './TabLink.js';\nimport ReconciliationServiceInput from './ReconciliationServiceInput.js';\nimport TestBench from './TestBench.js';\nimport { HashRouter, Switch, Route, useParams, useHistory } from \"react-router-dom\";\n\n\nfunction TestbenchTab({ servicesMap, onEndpointChange }) {\n\n var { endpoint } = useParams();\n endpoint = endpoint ? decodeURIComponent(endpoint) : undefined;\n let service = servicesMap[endpoint];\n let testBench =
    ;\n if (endpoint && service) {\n testBench = ();\n }\n\n let history = useHistory();\n let handleChange = function (service) {\n onEndpointChange(service);\n if (service) {\n history.push(`/client/${encodeURIComponent(service.endpoint)}`);\n }\n };\n\n return (\n
    \n

    This form lets you test a reconciliation endpoint interactively.

    \n \n {testBench}\n
    );\n}\n\nfunction TableTab({ onEndpointSelect, style }) {\n\n let history = useHistory();\n \n let handleSelect = function (service) {\n onEndpointSelect(service);\n history.push(`/client/${encodeURIComponent(service.endpoint)}`);\n };\n\n return (
    \n

    This table lists reconciliation services known to Wikidata and\n indicates which features of the reconciliation API they support.\n

    \n

    If you are viewing this app over HTTPS it is likely that reconciliation services using HTTP are blocked as \"mixed content\". You can disable this protection in your browser to load HTTP reconciliation services.

    \n \n \n \n
    );\n}\n\nexport default class App extends React.Component {\n constructor() {\n super();\n this.state = {\n selectedEndpoint: '',\n servicesMap: {},\n openTab: 'servicesList',\n refreshing: false,\n servicesList: []\n };\n }\n\n onEndpointSelect = (service) => {\n let newServicesMap = Object.assign(this.state.servicesMap);\n if (service) {\n newServicesMap[service.endpoint] = service;\n }\n this.setState({\n selectedEndpoint: service ? service.endpoint : undefined,\n servicesMap: newServicesMap,\n openTab: 'testBench',\n });\n }\n\n handleTabSelect = (key) => {\n this.setState({ openTab: key });\n };\n\n render() {\n return (\n \n
    \n

    Reconciliation service test bench

    \n

    Source repository

    \n
      \n \n \n
    \n \n \n \n \n \n \n \n \n \n } />\n
    \n
    \n );\n }\n}\n\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""} \ No newline at end of file