diff --git a/RUNTIME/VISA.new.sh b/RUNTIME/VISA.new.sh index 8d760fe9..a5a9e61f 100755 --- a/RUNTIME/VISA.new.sh +++ b/RUNTIME/VISA.new.sh @@ -112,7 +112,7 @@ fi ################################################################################ TWMODEL="/ipfs/bafybeiaaf52awrqliwn5mqleua6tcv4qv5oxjfa6j2web6nh42vzdtjkiu" # ipfs cat $TWMODEL > templates/twdefault.html -MINIMAL="/ipfs/bafybeidgyo756zmsltbq5ptxjdn2spncv5pccn6vxes3j7cqubqlohjr2e" +MINIMAL="/ipfs/bafybeidp2vvvtdi3hdq3tknwfzuhjqqa6tfkepc233bdr2rg2ws4qnbvum" # ipfs cat $MINIMAL > templates/minimal.html ##################################################### # NEW PLAYER ############### ################################################################################ @@ -530,8 +530,8 @@ echo "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" #~ U Planet : ${myUPLANET} #~ Astroport.ONE ★ PKI ★ Ğ1/Ŋ1 ★ DAO ★ Libre ★"; # sleep 1 - -echo +echo "★ GCHANGE ★" +echo "Use $SALT and $PEPPER to register on https://gchange.fr and exchange ★ with friends" echo "$(${MY_PATH}/../tools/face.sh friendly)" #~ DISCONNECT : $DISCO&logout=${PLAYER} #~ CONNECT : $DISCO&login=${PLAYER}" diff --git a/templates/minimal.html b/templates/minimal.html index 4e5c8c72..eb7d1a22 100644 --- a/templates/minimal.html +++ b/templates/minimal.html @@ -177,6 +177,8 @@ Error message and password prompt
  • $:/plugins/Gk0Wk/CPL-Repo
  • +
  • $:/plugins/Gk0Wk/drawio
  • +
  • $:/plugins/ipfs
  • $:/plugins/sycom/leaflet
  • @@ -185,6 +187,8 @@ Error message and password prompt
  • $:/SiteTitle
  • +
  • $:/state/addplugins/tab-1342078386
  • +
  • $:/state/http-requests
  • $:/state/plugin-info-1935472218-$:/plugins/ipfs--1406793555
  • @@ -252,27 +256,29 @@ Error message and password prompt {"created":"20221206094839243","creator":"Boris","text":"{\n \"tiddlers\": {\n \"$:/plugins/astroport/lasertag/tag-on-import.js\": {\n \"created\": \"20221206090145388\",\n \"creator\": \"Boris\",\n \"text\": \"(function(){\\n\\n\\t/*jslint node: true, browser: true */\\n\\t/*global $tw: false */\\n\\t\\\"use strict\\\";\\n\\n\\t// Export name and synchronous status\\n\\texports.name = \\\"tagonimport\\\";\\n\\texports.platforms = [\\\"browser\\\"];\\n\\texports.after = [\\\"startup\\\"];\\n\\n\\texports.startup = function() {\\n\\n\\t\\t$tw.hooks.addHook('th-importing-tiddler', function (tiddler) {\\n\\n\\n\\t\\t\\tlet defaultTags = $tw.wiki.getTiddlerList(\\\"$:/config/NewTiddler/Tags\\\", \\\"text\\\")\\n\\t\\t\\t\\n\\t\\t\\tvar updatedTiddler = $tw.utils.updateTiddler({\\n\\t\\t\\t\\ttiddler: tiddler,\\n\\t\\t\\t\\taddTags: defaultTags\\n\\t\\t\\t})\\n\\n\\t\\t\\treturn updatedTiddler;\\n\\n\\t\\t});\\n\\n\\t};\\n\\n})();\",\n \"tags\": \"\",\n \"title\": \"$:/plugins/astroport/lasertag/tag-on-import.js\",\n \"modified\": \"20221206094828863\",\n \"modifier\": \"Boris\",\n \"module-type\": \"startup\",\n \"type\": \"application/javascript\"\n },\n \"$:/core/macros/tag\": {\n \"created\": \"20221126185104782\",\n \"creator\": \"Boris\",\n \"text\": \"\\\\define tag-pill-styles()\\nbackground-color:$(backgroundColor)$;\\nfill:$(foregroundColor)$;\\ncolor:$(foregroundColor)$;\\n\\\\end\\n\\n\u003C!-- This has no whitespace trim to avoid modifying $actions$. Closing tags omitted for brevity. -->\\n\\\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\\n\u003C$vars\\n\\tforegroundColor=\u003C\u003Ccontrastcolour target:\\\"\\\"\\\"$colour$\\\"\\\"\\\" fallbackTarget:\\\"\\\"\\\"$fallbackTarget$\\\"\\\"\\\" colourA:\\\"\\\"\\\"$colourA$\\\"\\\"\\\" colourB:\\\"\\\"\\\"$colourB$\\\"\\\"\\\">>\\n\\tbackgroundColor=\\\"\\\"\\\"$colour$\\\"\\\"\\\"\\n>\u003C$element-tag$\\n\\t$element-attributes$\\n\\tclass=\\\"tc-tag-label tc-btn-invisible\\\"\\n\\tstyle=\u003C\u003Ctag-pill-styles>>\\n>\u003C$set name=\\\"tiddlersWithThisTag\\\" filter=\\\"[tag\u003C__tag__>]\\\">\u003C$action-listops $tiddler=\\\"$:/StoryList\\\" $field=\\\"list\\\" $filter=\\\"[enlist\u003CtiddlersWithThisTag>] +[!sort[create]] +[limit[5]]\\\" />\u003C/$set>$actions$\u003C$transclude tiddler=\\\"\\\"\\\"$icon$\\\"\\\"\\\"/>\u003C$view tiddler=\u003C\u003C__tag__>> field=\\\"title\\\" format=\\\"text\\\" />\\n\\\\end\\n\\n\\n\\\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\\n\u003C$macrocall $name=\\\"tag-pill-inner\\\" tag=\u003C\u003C__tag__>> icon=\\\"\\\"\\\"$icon$\\\"\\\"\\\" colour=\\\"\\\"\\\"$colour$\\\"\\\"\\\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} element-tag=\\\"\\\"\\\"$element-tag$\\\"\\\"\\\" element-attributes=\\\"\\\"\\\"$element-attributes$\\\"\\\"\\\" actions=\\\"\\\"\\\"$actions$\\\"\\\"\\\"/>\\n\\\\end\\n\\n\\\\define tag-pill(tag,element-tag:\\\"span\\\",element-attributes:\\\"\\\",actions:\\\"\\\")\\n\\\\whitespace trim\\n\u003Cspan class=\\\"tc-tag-list-item\\\" data-tag-title=\u003C\u003C__tag__>>>\\n\u003C$let currentTiddler=\u003C\u003C__tag__>>>\\n\u003C$macrocall $name=\\\"tag-pill-body\\\" tag=\u003C\u003C__tag__>> icon={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}} colour={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}} palette={{$:/palette}} element-tag=\\\"\\\"\\\"$element-tag$\\\"\\\"\\\" element-attributes=\\\"\\\"\\\"$element-attributes$\\\"\\\"\\\" actions=\\\"\\\"\\\"$actions$\\\"\\\"\\\"/>\\n\u003C/$let>\\n\u003C/span>\\n\\\\end\\n\\n\\\\define tag(tag)\\n{{$tag$||$:/core/ui/TagTemplate}}\\n\\\\end\\n\",\n \"title\": \"$:/core/macros/tag\",\n \"tags\": \"$:/tags/Macro\",\n \"modified\": \"20221206141041799\",\n \"modifier\": \"Boris\"\n },\n \"$:/core/ui/TagTemplate\": {\n \"created\": \"20221126144610490\",\n \"creator\": \"Boris\",\n \"text\": \"\\\\whitespace trim\\n\u003Cspan class=\\\"tc-tag-list-item\\\" data-tag-title=\u003C\u003CcurrentTiddler>>>\\n\u003C$set name=\\\"transclusion\\\" value=\u003C\u003CcurrentTiddler>>>\\n\u003C$macrocall $name=\\\"tag-pill-body\\\" tag=\u003C\u003CcurrentTiddler>> icon={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}} colour={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}} palette={{$:/palette}} element-tag=\\\"\\\"\\\"$button\\\"\\\"\\\" element-attributes=\\\"\\\"\\\"tag='span'\\\"\\\"\\\"/>\\n\u003C/$set>\\n\u003C/span>\\n\",\n \"title\": \"$:/core/ui/TagTemplate\",\n \"modified\": \"20221206140859322\",\n \"modifier\": \"Boris\",\n \"tags\": \"\"\n }\n }\n}","tags":"$:/isAttachment $:/isEmbedded","title":"$:/plugins/astroport/lasertag","modified":"20231007121836978","modifier":"_PSEUDO_","type":"application/json","author":"Astroport","name":"Astroport :: Lasertag ::","description":"Automatically tag tiddlers on import, and update the view when clicking tag pills","plugin-type":"plugin","version":"0.0.5","plugin-priority":"10"}, {"created":"20221204164729903","creator":"Boris","text":"{\n \"tiddlers\": {\n \"$:/plugins/astroport/lightbeams/friends.js\": {\n \"created\": \"20221130194918470\",\n \"creator\": \"Boris\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/astroport/lightbeams/homefeed.js\\ntype: application/javascript\\nmodule-type: macro\\nMacro to return the user's homefeed\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nInformation about this macro\\n*/\\n\\nexports.name = \\\"friends\\\";\\n\\nexports.params = [\\n];\\n\\n\\nexports.run = async function() {\\n\\n\\tlet gchangeNode = 'https://data.gchange.fr'\\n\\tlet uri = '/like/record/_search'\\n\\tlet url = gchangeNode + uri\\n\\tlet playerId = $tw.wiki.getTiddler('$:/plugins/astroport/lightbeams/state/playerGchangeId').fields.text\\n\\n\\tconsole.log('playerId :', playerId)\\n\\n\\t//\\n\\t// Get ratings I received\\n\\t//\\n\\t\\n\\tlet params = {\\n\\t\\tsize : 150, \\n\\t\\tquery : {\\n\\t\\t\\tbool : {\\n\\t\\t\\t\\tmust : [\\n\\t\\t\\t\\t\\t{term : {kind : 'STAR'}}\\n\\t\\t\\t\\t], \\n\\t\\t\\t\\tfilter : [\\n\\t\\t\\t\\t\\t{term : {id : playerId}}\\n\\t\\t\\t\\t]\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tlet fetchOpts = {\\n\\n\\t\\tmethod: 'POST',\\n\\t\\theaders: {\\n\\t\\t\\t'Content-Type': 'application/json;charset=utf-8'\\n\\t\\t},\\n\\t\\tbody: JSON.stringify(params)\\n\\t}\\n\\n\\tlet response = await fetch(url, fetchOpts)\\n\\n\\tlet jsonData = await response.json()\\n\\n\\tconsole.log(jsonData)\\n\\n\\tlet starSenders = ''\\n\\n\\tfor (const record of jsonData.hits.hits) {\\n\\n\\t\\t// sender\\n\\t\\tstarSenders += record._source.issuer + \\\"\\\\n\\\"\\n\\n\\t\\t// receiver\\n\\t\\t// friendsList += record._source.id\\n\\t}\\n\\n\\tlet fields = {title: '$:/plugins/astroport/lightbeams/state/stars_senders', text: starSenders}\\n\\t$tw.wiki.addTiddler(new $tw.Tiddler(fields))\\n\\n\\n\\t//\\n\\t// Get ratings I sent\\n\\t//\\n\\n\\tparams = {\\n\\t\\tsize: 150, \\n\\n\\t\\tquery : {\\n\\t\\t\\tbool : {\\n\\t\\t\\t\\tmust : [\\n\\t\\t\\t\\t\\t{term : {kind : 'STAR'} }\\n\\t\\t\\t\\t], \\n\\t\\t\\t\\tfilter : [\\n\\t\\t\\t\\t\\t{term : {issuer : playerId}}\\n\\t\\t\\t\\t]\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfetchOpts = {\\n\\n\\t\\tmethod: 'POST',\\n\\t\\theaders: {\\n\\t\\t\\t'Content-Type': 'application/json;charset=utf-8'\\n\\t\\t},\\n\\t\\tbody: JSON.stringify(params)\\n\\t}\\n\\n\\tresponse = await fetch(url, fetchOpts)\\n\\n\\tjsonData = await response.json()\\n\\n\\tconsole.log(jsonData)\\n\\n\\tlet starSendees = ''\\n\\n\\tfor (const record of jsonData.hits.hits) {\\n\\n\\t\\t// sender\\n\\t\\tstarSendees += record._source.id + \\\"\\\\n\\\"\\n\\t}\\n\\n\\tfields = {title: '$:/plugins/astroport/lightbeams/state/stars_sendees', text: starSendees}\\n\\t$tw.wiki.addTiddler(new $tw.Tiddler(fields))\\n}\\n\\n\\n})();\",\n \"tags\": \"\",\n \"title\": \"$:/plugins/astroport/lightbeams/friends.js\",\n \"modified\": \"20221204180955944\",\n \"modifier\": \"Boris\",\n \"type\": \"application/javascript\",\n \"module-type\": \"macro\"\n },\n \"$:/plugins/astroport/lightbeams/HomeFeed\": {\n \"created\": \"20221130140952175\",\n \"creator\": \"Boris\",\n \"text\": \"\u003C!-- -->\",\n \"title\": \"$:/plugins/astroport/lightbeams/HomeFeed\",\n \"modified\": \"20221204165539922\",\n \"modifier\": \"Boris\",\n \"tags\": \"\"\n },\n \"$:/plugins/astroport/lightbeams/homefeed.js\": {\n \"created\": \"20221130144350767\",\n \"creator\": \"Boris\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/astroport/lightbeams/homefeed.js\\ntype: application/javascript\\nmodule-type: macro\\nMacro to return the user's homefeed\\n\\\\*/\\n\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nInformation about this macro\\n*/\\n\\nexports.name = \\\"homefeed\\\";\\n\\nexports.params = [\\n];\\n\\n\\nexports.run = async function() {\\n\\n\\t// const IpfsController = require('$:/plugins/ipfs/ipfs-controller.js').IpfsController\\n\\t// let gateway = IpfsController.getIpfsDefaultGateway()\\n\\n\\tlet gateway = $tw.wiki.getTiddler($tw.wiki.getTiddler('$:/ipfs/saver/gateway').fields.text).fields.text\\n\\n\\tlet subscriptions = $tw.wiki.getTiddler('$:/plugins/astroport/lightbeams/state/subscriptions')\\n\\n\\tlet subs = subscriptions.fields.text.split(\\\"\\\\n\\\")\\n\\n\\tlet posts = []\\n\\n\\tfor (const sub of subs) {\\n\\n\\t\\tlet url = gateway + '/ipns/' + sub\\n\\n\\t\\tlet reponse = await fetch(url)\\n\\n\\t\\tlet jsonFeed = await reponse.json()\\n\\n\\t\\t// console.log(jsonFeed)\\n\\t\\t// let feed = JSON.parse(jsonFeed)\\n\\n\\t\\tfor (const entry of jsonFeed) {\\n\\n\\t\\t\\tposts.push(entry)\\n\\t\\t}\\n\\t}\\n\\n\\n\\tlet sortPosts = function (a, b) {\\n\\n\\t\\treturn a.created > b.created ? -1 : 1;\\n\\t}\\n\\n\\tposts.sort(sortPosts)\\n\\n\\tconsole.log(posts)\\n\\t\\n\\n\\tlet html = '';\\n\\n\\tfor (const entry of posts) {\\n\\n\\t\\thtml += `\\n\\t\\t\u003Carticle class=\\\"post\\\">\\n\\t\\t\\t\u003Ch2>` + entry.title + `\u003C/h2>\\n\\n\\t\\t\\t\u003Csection class=\\\"contents\\\">`;\\n\\n\\t\\t\\tswitch (entry.type) {\\n\\n\\t\\t\\t\\tcase 'video/mp4':\\n\\n\\t\\t\\t\\t\\tif (entry._canonical_uri) {\\n\\n\\t\\t\\t\\t\\t\\thtml += `\\n\\t\\t\\t\\t\\t\\t\u003Cvideo controls>\\n\\t\\t\\t\\t\\t\\t\\t\u003Csource src=\\\"`+ entry._canonical_uri +`\\\" type=\\\"video/mp4\\\" />\\n\\n\\t\\t\\t\\t\\t\\t\\tVotre navigateur ne gère pas la balise vidéo.\\n\\t\\t\\t\\t\\t\\t\u003C/video>\\n\\t\\t\\t\\t\\t\\t`\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tbreak;\\n\\n\\t\\t\\t\\tcase 'image/png':\\n\\n\\t\\t\\t\\t\\tif (entry._canonical_uri) {\\n\\n\\t\\t\\t\\t\\t\\thtml += `\\n\\t\\t\\t\\t\\t\\t\u003Cimg src=\\\"`+ entry._canonical_uri +`\\\" />\\n\\t\\t\\t\\t\\t\\t`\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tbreak;\\n\\n\\t\\t\\t\\tcase 'image/jpeg':\\n\\n\\t\\t\\t\\t\\tif (entry._canonical_uri) {\\n\\n\\t\\t\\t\\t\\t\\thtml += `\\n\\t\\t\\t\\t\\t\\t\u003Cimg src=\\\"`+ entry._canonical_uri +`\\\" />\\n\\t\\t\\t\\t\\t\\t`\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tbreak;\\n\\n\\t\\t\\t\\tcase 'image/gif':\\n\\n\\t\\t\\t\\t\\tif (entry._canonical_uri) {\\n\\n\\t\\t\\t\\t\\t\\thtml += `\\n\\t\\t\\t\\t\\t\\t\u003Cimg src=\\\"`+ entry._canonical_uri +`\\\" />\\n\\t\\t\\t\\t\\t\\t`\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tbreak;\\n\\n\\t\\t\\t\\tcase 'text/plain':\\n\\n\\t\\t\\t\\t\\thtml += entry.text\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\n\\t\\t\\thtml += `\\n\\t\\t\\t\u003C/section>\\n\\t\\t\\t`\\n\\n\\t\\t\\tlet params = ''\\n\\t\\t\\tparams += !(entry._canonical_uri) ? '' : ' _canonical_uri=\\\"' + entry._canonical_uri +'\\\"'\\n\\n\\t\\t\\thtml +=`\\n\\t\\t\\t\u003Cfooter>\\n\\t\\t\\t\\t\u003C$button>\\n\\t\\t\\t\\t\\t\u003C$action-createtiddler \\n\\t\\t\\t\\t\\t\\t$basetitle=\\\"`+ entry.title +`\\\" \\n\\t\\t\\t\\t\\t\\ttype=\\\"`+ entry.type +`\\\" \\n\\t\\t\\t\\t\\t\\ttags=\\\"`+ entry.tags +`\\\" \\n\\t\\t\\t\\t\\t\\ttext=\\\"`+ entry.text +`\\\" \\n\\t\\t\\t\\t\\t\\t`+ params + `>\\n\\t\\t\\t\\t\\t\\t\u003C$action-navigate $to=\u003C\u003CcreateTiddler-title>>/>\\n\\t\\t\\t\\t\\t\u003C/$action-createtiddler>\\n\\t\\t\\t\\t\\tAjouter à mon Tiddly\\n\\t\\t\\t\\t\u003C/$button>\\n\\t\\t\\t\u003C/footer>\\n\\t\\t\u003C/article>\\n\\t\\t`\\n\\t}\\n\\n\\t// console.log('html:', html)\\n\\tlet feedTiddlerTitle = '$:/plugins/astroport/lightbeams/myFeed'\\n\\tlet feedtiddlerFields = {title: feedTiddlerTitle, text: html}\\n\\n\\tlet feedTiddler = $tw.wiki.getTiddler(feedTiddlerTitle)\\n\\n\\tif (feedTiddler !== undefined) {\\n\\n\\t\\tfeedTiddler = $tw.utils.updateTiddler({\\n\\t\\t\\ttiddler: feedTiddler,\\n\\t\\t\\tfields: feedtiddlerFields\\n\\t\\t})\\n\\n\\t\\t$tw.wiki.addTiddler(feedTiddler)\\n\\n\\t} else {\\n\\n\\t\\t$tw.wiki.addTiddler(new $tw.Tiddler(feedtiddlerFields))\\n\\t}\\n\\t\\n\\treturn true\\n\\n};\\n\\n})();\",\n \"tags\": \"$:/isIpfs $:/isExported\",\n \"title\": \"$:/plugins/astroport/lightbeams/homefeed.js\",\n \"modified\": \"20221205171128263\",\n \"modifier\": \"Boris\",\n \"type\": \"application/javascript\",\n \"module-type\": \"macro\",\n \"_export_uri\": \"/ipfs/bafybeih4w3nhjie4kk4nftf5c3qoogcx5k4uy33vjcko2mdwsnw4cbmxpa\"\n },\n \"$:/plugins/astroport/lightbeams/lightbeams-action.js\": {\n \"created\": \"20221205102310210\",\n \"creator\": \"Boris\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/astroport/lightbeams/lightbeams-action.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: library\\n\\nLightbeams Action\\n\\n\\\\*/\\n\\n;(function () {\\n\\t/*jslint node: true, browser: true */\\n\\t/*global $tw: false */\\n\\t'use strict'\\n\\n\\tconst fileProtocol = 'file:'\\n\\tconst ipfsKeyword = 'ipfs'\\n\\tconst ipnsKeyword = 'ipns'\\n\\n\\tconst name = 'lightbeams-action'\\n\\n\\tvar LightbeamsAction = function () {\\n\\t\\tthis.once = false\\n\\t\\tthis.console = false\\n\\t\\tthis.ipnsName = $tw.utils.getIpfsIpnsName()\\n\\t\\tthis.ipnsKey = $tw.utils.getIpfsIpnsKey()\\n\\t\\tthis.ipnsName_Lightbeam = $tw.utils.getIpfsIpnsName_Lightbeam()\\n\\t\\tthis.ipnsKey_Lightbeam = $tw.utils.getIpfsIpnsKey_Lightbeam()\\n\\t}\\n\\n\\tLightbeamsAction.prototype.getLogger = function () {\\n\\t\\treturn window.log.getLogger(name)\\n\\t}\\n\\n\\tLightbeamsAction.prototype.init = function () {\\n\\t\\t// Init once\\n\\t\\tif (this.once) {\\n\\t\\t\\treturn\\n\\t\\t}\\n\\t\\tconst self = this\\n\\n\\t\\t$tw.rootWidget.addEventListener('tm-lightbeam-ipns-publish', async function (event) {\\n\\t\\t\\treturn await self.handlePublishToIpns_Lightbeam(event)\\n\\t\\t})\\n\\n\\t\\t// Buttons in control panel\\n\\n\\t\\t$tw.rootWidget.addEventListener('tm-lightbeam-ipns-rename', async function (event) {\\n\\t\\t\\treturn await self.handleRenameIpnsName_Lightbeam(event)\\n\\t\\t})\\n\\n\\t\\t$tw.rootWidget.addEventListener('tm-lightbeam-ipns-generate', async function (event) {\\n\\t\\t\\treturn await self.handleGenerateIpnsKey_Lightbeam(event)\\n\\t\\t})\\n\\n\\t\\t$tw.rootWidget.addEventListener('tm-lightbeam-ipns-remove', async function (event) {\\n\\t\\t\\treturn await self.handleRemoveIpnsKey_Lightbeam(event)\\n\\t\\t})\\n\\n\\t\\t$tw.rootWidget.addEventListener('tm-lightbeam-ipns-fetch', async function (event) {\\n\\t\\t\\treturn await self.handleFetchIpnsKey_Lightbeam(event)\\n\\t\\t})\\n\\n\\t\\t$tw.rootWidget.addEventListener('tm-lightbeam-ipns-resolve-and-open', async function (\\n\\t\\t\\tevent\\n\\t\\t) {\\n\\t\\t\\treturn await self.handleResolveIpnsKeyAndOpen_Lightbeam(event)\\n\\t\\t})\\n\\n\\t\\t// Init once\\n\\t\\tthis.once = true\\n\\t}\\n\\n\\tLightbeamsAction.prototype.handlePublishToIpns_Lightbeam = async function (event) {\\n\\t\\tvar cid = null\\n\\t\\tvar ipnsKey = null\\n\\t\\tvar wikiCid = null\\n\\t\\tvar wikiIpnsKey = null\\n\\t\\tconst self = this\\n\\t\\tconst wiki = $tw.ipfs.getDocumentUrl()\\n\\t\\tif (wiki.protocol === fileProtocol) {\\n\\t\\t\\t$tw.utils.alert(name, 'Undefined IPFS identifier...')\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\tif (wiki.pathname === '/') {\\n\\t\\t\\t$tw.utils.alert(name, 'Unknown IPFS identifier...')\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\tvar ipnsName = $tw.utils.getIpfsIpnsName()\\n\\t\\tipnsName =\\n\\t\\t\\tipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n\\t\\t\\t\\t? null\\n\\t\\t\\t\\t: ipnsName.trim()\\n\\t\\tif (ipnsName == null) {\\n\\t\\t\\t$tw.utils.alert(name, 'Undefined IPNS name....')\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\ttry {\\n\\t\\t\\tvar { cid, ipnsKey } = await $tw.ipfs.resolveUrl(\\n\\t\\t\\t\\ttrue,\\n\\t\\t\\t\\tfalse,\\n\\t\\t\\t\\t`/ipns/${ipnsName}`\\n\\t\\t\\t)\\n\\t\\t\\tvar { cid: wikiCid, ipnsKey: wikiIpnsKey } = await $tw.ipfs.resolveUrl(\\n\\t\\t\\t\\ttrue,\\n\\t\\t\\t\\ttrue,\\n\\t\\t\\t\\twiki\\n\\t\\t\\t)\\n\\t\\t} catch (error) {\\n\\t\\t\\tthis.getLogger().error(error)\\n\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\tif (wikiIpnsKey !== null && wikiIpnsKey === ipnsKey) {\\n\\t\\t\\t$tw.utils.alert(name, 'Default IPNS key matches current IPNS key....')\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\t$tw.utils.alert(name, 'Publishing IPNS name: ' + ipnsName)\\n\\t\\t$tw.ipfs\\n\\t\\t\\t.publishIpnsName(wikiCid, ipnsKey, ipnsName)\\n\\t\\t\\t.then(data => {\\n\\t\\t\\t\\t$tw.ipfs.requestToUnpin(cid)\\n\\t\\t\\t\\t$tw.utils.alert(name, 'Successfully Published IPNS name: ' + ipnsName)\\n\\t\\t\\t})\\n\\t\\t\\t.catch(error => {\\n\\t\\t\\t\\tself.getLogger().error(error)\\n\\t\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\t})\\n\\t\\treturn true\\n\\t}\\n\\n\\tLightbeamsAction.prototype.handleRenameIpnsName_Lightbeam = async function (event) {\\n\\t\\tvar ipnsKey = null\\n\\t\\tvar ipnsName = $tw.utils.getIpfsIpnsName_Lightbeam()\\n\\t\\tipnsName =\\n\\t\\t\\tipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n\\t\\t\\t\\t? null\\n\\t\\t\\t\\t: ipnsName.trim()\\n\\t\\tif (ipnsName == null) {\\n\\t\\t\\t$tw.utils.alert(name, 'Undefined IPNS name....')\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\tif (this.ipnsName == null || this.ipnsName === ipnsName) {\\n\\t\\t\\t$tw.utils.alert(name, 'Nothing to rename....')\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\ttry {\\n\\t\\t\\tvar { ipnsKey } = await $tw.ipfs.renameIpnsName(this.ipnsName_Lightbeam, ipnsName)\\n\\t\\t} catch (error) {\\n\\t\\t\\tthis.getLogger().error(error)\\n\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\tvar tiddler = $tw.wiki.getTiddler('$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-key')\\n\\t\\tif (tiddler !== undefined && this.ipnsKey !== ipnsKey) {\\n\\t\\t\\ttiddler = $tw.utils.updateTiddler({\\n\\t\\t\\t\\ttiddler: tiddler,\\n\\t\\t\\t\\tfields: [{ key: 'text', value: ipnsKey }]\\n\\t\\t\\t})\\n\\t\\t\\t$tw.wiki.addTiddler(tiddler)\\n\\t\\t}\\n\\t\\tthis.ipnsKey_Lightbeam = ipnsKey\\n\\t\\tthis.ipnsName_Lightbeam = ipnsName\\n\\t\\treturn true\\n\\t}\\n\\n\\tLightbeamsAction.prototype.handleGenerateIpnsKey_Lightbeam = async function (event) {\\n\\t\\tvar ipnsKey = null\\n\\t\\tvar ipnsName = $tw.utils.getIpfsIpnsName_Lightbeam()\\n\\t\\tipnsName =\\n\\t\\t\\tipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n\\t\\t\\t\\t? null\\n\\t\\t\\t\\t: ipnsName.trim()\\n\\t\\tif (ipnsName == null) {\\n\\t\\t\\t$tw.utils.alert(name, 'Undefined IPNS name....')\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\ttry {\\n\\t\\t\\tvar ipnsKey = await $tw.ipfs.generateIpnsKey(ipnsName)\\n\\t\\t} catch (error) {\\n\\t\\t\\tthis.getLogger().error(error)\\n\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\tvar tiddler = $tw.wiki.getTiddler('$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-key')\\n\\n\\t\\tif (tiddler === undefined) {\\n\\n\\t\\t\\ttiddler = new $tw.Tiddler({\\n\\t\\t\\t\\ttitle: '$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-key',\\n\\t\\t\\t\\ttext: ipnsKey\\n\\t\\t\\t})\\n\\t\\t\\t$tw.wiki.addTiddler(tiddler)\\n\\n\\t\\t} else if (this.ipnsKey_Lightbeam !== ipnsKey) {\\n\\t\\t\\ttiddler = $tw.utils.updateTiddler({\\n\\t\\t\\t\\ttiddler: tiddler,\\n\\t\\t\\t\\tfields: [{ key: 'text', value: ipnsKey }]\\n\\t\\t\\t})\\n\\t\\t\\t$tw.wiki.addTiddler(tiddler)\\n\\t\\t}\\n\\t\\tthis.ipnsKey_Lightbeam = ipnsKey\\n\\t\\tthis.ipnsName_Lightbeam = ipnsName\\n\\t\\treturn true\\n\\t}\\n\\n\\tLightbeamsAction.prototype.handleRemoveIpnsKey_Lightbeam = async function (event) {\\n\\t\\tvar ipnsKey = null\\n\\t\\tvar normalizedUrl = null\\n\\t\\tconst self = this\\n\\t\\tvar ipnsName = $tw.utils.getIpfsIpnsName_Lightbeam()\\n\\t\\tipnsName =\\n\\t\\t\\tipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n\\t\\t\\t\\t? null\\n\\t\\t\\t\\t: ipnsName.trim()\\n\\t\\tif (ipnsName == null) {\\n\\t\\t\\t$tw.utils.alert(name, 'Undefined IPNS name....')\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\ttry {\\n\\t\\t\\tvar { ipnsKey, normalizedUrl } = await $tw.ipfs.getIpnsIdentifiers(\\n\\t\\t\\t\\tipnsName\\n\\t\\t\\t)\\n\\t\\t} catch (error) {\\n\\t\\t\\tthis.getLogger().error(error)\\n\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\t// Async\\n\\t\\t$tw.ipfs\\n\\t\\t\\t.requestToUnpin(null, ipnsKey, normalizedUrl)\\n\\t\\t\\t.then(data => {\\n\\t\\t\\t\\t$tw.ipfs\\n\\t\\t\\t\\t\\t.removeIpnsKey(ipnsName)\\n\\t\\t\\t\\t\\t.then(data => {\\n\\t\\t\\t\\t\\t\\t$tw.utils.alert(name, 'Succesfully removed Ipns key....')\\n\\t\\t\\t\\t\\t})\\n\\t\\t\\t\\t\\t.catch(error => {\\n\\t\\t\\t\\t\\t\\tself.getLogger().error(error)\\n\\t\\t\\t\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\t\\t\\t})\\n\\t\\t\\t})\\n\\t\\t\\t.catch(error => {\\n\\t\\t\\t\\tself.getLogger().error(error)\\n\\t\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\t})\\n\\t\\tvar tiddler = $tw.wiki.getTiddler('$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-name')\\n\\t\\tif (tiddler !== undefined) {\\n\\t\\t\\tconst updatedTiddler = $tw.utils.updateTiddler({\\n\\t\\t\\t\\ttiddler: tiddler,\\n\\t\\t\\t\\tfields: [{ key: 'text', value: '' }]\\n\\t\\t\\t})\\n\\t\\t\\t$tw.wiki.addTiddler(updatedTiddler)\\n\\t\\t}\\n\\t\\ttiddler = $tw.wiki.getTiddler('$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-key')\\n\\t\\tif (tiddler !== undefined) {\\n\\t\\t\\tconst updatedTiddler = $tw.utils.updateTiddler({\\n\\t\\t\\t\\ttiddler: tiddler,\\n\\t\\t\\t\\tfields: [{ key: 'text', value: '' }]\\n\\t\\t\\t})\\n\\t\\t\\t$tw.wiki.addTiddler(updatedTiddler)\\n\\t\\t}\\n\\t\\tthis.ipnsName_Lightbeam = null\\n\\t\\tthis.ipnsKey_Lightbeam = null\\n\\t\\treturn true\\n\\t}\\n\\n\\tLightbeamsAction.prototype.handleFetchIpnsKey_Lightbeam = async function (event) {\\n\\t\\tvar ipnsKey = null\\n\\t\\tvar ipnsName = $tw.utils.getIpfsIpnsName_Lightbeam()\\n\\t\\tipnsName =\\n\\t\\t\\tipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n\\t\\t\\t\\t? null\\n\\t\\t\\t\\t: ipnsName.trim()\\n\\t\\tif (ipnsName == null) {\\n\\t\\t\\t$tw.utils.alert(name, 'Undefined IPNS name for JSON....')\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\ttry {\\n\\t\\t\\tvar { ipnsKey } = await $tw.ipfs.getIpnsIdentifiers(ipnsName)\\n\\t\\t} catch (error) {\\n\\t\\t\\tthis.getLogger().error(error)\\n\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\n\\t\\tvar tiddler = $tw.wiki.getTiddler('$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-key')\\n\\n\\t\\tif (tiddler === undefined) {\\n\\n\\t\\t\\ttiddler = new $tw.Tiddler({\\n\\t\\t\\t\\ttitle: '$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-key',\\n\\t\\t\\t\\ttext: ipnsKey\\n\\t\\t\\t})\\n\\t\\t\\t$tw.wiki.addTiddler(tiddler)\\n\\n\\t\\t} else if (this.ipnsKey !== ipnsKey) {\\n\\n\\t\\t\\ttiddler = $tw.utils.updateTiddler({\\n\\t\\t\\t\\ttiddler: tiddler,\\n\\t\\t\\t\\tfields: [{ key: 'text', value: ipnsKey }]\\n\\t\\t\\t})\\n\\t\\t\\t$tw.wiki.addTiddler(tiddler)\\n\\t\\t\\tthis.ipnsKey_Lightbeam = ipnsKey\\n\\t\\t}\\n\\n\\t\\tthis.ipnsName_Lightbeam = ipnsName\\n\\t\\t\\n\\t\\treturn true\\n\\t}\\n\\n\\tLightbeamsAction.prototype.handleResolveIpnsKeyAndOpen_Lightbeam = async function (event) {\\n\\t\\tvar ipnsKey = null\\n\\t\\tvar resolvedUrl = null\\n\\t\\tvar ipnsName = $tw.utils.getIpfsIpnsName_Lightbeam()\\n\\t\\tipnsName =\\n\\t\\t\\tipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n\\t\\t\\t\\t? null\\n\\t\\t\\t\\t: ipnsName.trim()\\n\\t\\tif (ipnsName == null) {\\n\\t\\t\\t$tw.utils.alert(name, 'Undefined IPNS name....')\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\ttry {\\n\\t\\t\\tvar { ipnsKey, resolvedUrl } = await $tw.ipfs.resolveUrl(\\n\\t\\t\\t\\ttrue,\\n\\t\\t\\t\\tfalse,\\n\\t\\t\\t\\t`/${ipnsKeyword}/${ipnsName}`\\n\\t\\t\\t)\\n\\t\\t} catch (error) {\\n\\t\\t\\tthis.getLogger().error(error)\\n\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\tvar tiddler = $tw.wiki.getTiddler('$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-key')\\n\\t\\tif (tiddler !== undefined && this.ipnsKey_Lightbeam !== ipnsKey) {\\n\\t\\t\\ttiddler = $tw.utils.updateTiddler({\\n\\t\\t\\t\\ttiddler: tiddler,\\n\\t\\t\\t\\tfields: [{ key: 'text', value: ipnsKey }]\\n\\t\\t\\t})\\n\\t\\t\\tthis.ipnsKey_Lightbeam = ipnsKey\\n\\t\\t\\t$tw.wiki.addTiddler(tiddler)\\n\\t\\t}\\n\\t\\tthis.ipnsName_Lightbeam = ipnsName\\n\\t\\twindow.open(resolvedUrl.toString(), '_blank', 'noopener,noreferrer')\\n\\t\\treturn true\\n\\t}\\n\\n\\tLightbeamsAction.prototype.exportTiddlersAsJson = async function (\\n\\t\\texportFilter,\\n\\t\\texportUri,\\n\\t\\tspaces\\n\\t) {\\n\\t\\tvar tiddlers = $tw.wiki.filterTiddlers(exportFilter)\\n\\t\\tvar spaces =\\n\\t\\t\\tspaces === undefined ? $tw.config.preferences.jsonSpaces : spaces\\n\\t\\tvar data = []\\n\\t\\t// Process Tiddlers\\n\\t\\tfor (var t = 0; t \u003C tiddlers.length; t++) {\\n\\t\\t\\t// Load Tiddler\\n\\t\\t\\tvar tiddler = $tw.wiki.getTiddler(tiddlers[t])\\n\\t\\t\\t// Process\\n\\t\\t\\tvar fields = {}\\n\\t\\t\\t// Process fields\\n\\t\\t\\tfor (var field in tiddler.fields) {\\n\\t\\t\\t\\t// Discard\\n\\t\\t\\t\\tif (field === 'tags' || field === '_export_uri') {\\n\\t\\t\\t\\t\\tcontinue\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tvar ipnsKey = null\\n\\t\\t\\t\\tvar fieldValue = tiddler.getFieldString(field)\\n\\t\\t\\t\\tif (field === '_canonical_uri' && fieldValue === exportUri) {\\n\\t\\t\\t\\t\\tcontinue\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (field === '_import_uri' && fieldValue === exportUri) {\\n\\t\\t\\t\\t\\tcontinue\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\tvar { ipnsKey } = await $tw.ipfs.resolveUrl(false, false, fieldValue)\\n\\t\\t\\t\\t} catch (error) {\\n\\t\\t\\t\\t\\tthis.getLogger().error(error)\\n\\t\\t\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\t\\t\\treturn null\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// IPNS\\n\\t\\t\\t\\tif (ipnsKey !== null) {\\n\\t\\t\\t\\t\\tfieldValue = `/${ipnsKeyword}/${ipnsKey}`\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Store field\\n\\t\\t\\t\\tfields[field] = fieldValue\\n\\t\\t\\t}\\n\\t\\t\\t// Process tags\\n\\t\\t\\tvar tags = tiddler.fields.tags\\n\\t\\t\\tif (tags !== undefined && tags !== null) {\\n\\t\\t\\t\\tvar tagValues = ''\\n\\t\\t\\t\\tfor (var i = 0; i \u003C tags.length; i++) {\\n\\t\\t\\t\\t\\tconst tag = tags[i]\\n\\t\\t\\t\\t\\t// Discard\\n\\t\\t\\t\\t\\tif (tag === '$:/isExported' || tag === '$:/isImported') {\\n\\t\\t\\t\\t\\t\\tcontinue\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\ttagValues =\\n\\t\\t\\t\\t\\t\\t(tagValues.length === 0 ? '[[' : `${tagValues} [[`) + `${tag}]]`\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Store tags\\n\\t\\t\\t\\tfields.tags = tagValues\\n\\t\\t\\t}\\n\\t\\t\\t// Store\\n\\t\\t\\tdata.push(fields)\\n\\t\\t}\\n\\t\\treturn JSON.stringify(data, null, spaces)\\n\\t}\\n\\n\\texports.LightbeamsAction = LightbeamsAction\\n})()\\n\",\n \"title\": \"$:/plugins/astroport/lightbeams/lightbeams-action.js\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"library\",\n \"modified\": \"20221206122158841\",\n \"modifier\": \"Boris\"\n },\n \"$:/plugins/astroport/lightbeams/lightbeams-default.js\": {\n \"created\": \"20221205103617913\",\n \"creator\": \"Boris\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/astroport/lightbeams/saver/lightbeams-default.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: utils\\n\\nLightbeams Default\\n\\n\\\\*/\\n\\n;(function () {\\n\\t/*jslint node: true, browser: true */\\n\\t/*global $tw: false */\\n\\t'use strict'\\n\\n\\t/*\\n\\t * Retrieve ipfs saver ipns name with default value if applicable\\n\\t */\\n\\texports.getIpfsIpnsName_Lightbeam = function () {\\n\\t\\tvar ipnsName_Lightbeam = null\\n\\t\\tvar tiddler = $tw.wiki.getTiddler('$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-name')\\n\\t\\tif (tiddler !== undefined && tiddler !== null) {\\n\\t\\t\\tvar text = tiddler.getFieldString('text')\\n\\t\\t\\ttext =\\n\\t\\t\\t\\ttext === undefined || text == null || text.trim() === ''\\n\\t\\t\\t\\t\\t? null\\n\\t\\t\\t\\t\\t: text.trim()\\n\\t\\t\\tif (text !== null) {\\n\\t\\t\\t\\tipnsName_Lightbeam = text\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn ipnsName_Lightbeam\\n\\t}\\n\\n\\t/*\\n\\t * Retrieve ipfs saver ipns key with default value if applicable\\n\\t */\\n\\texports.getIpfsIpnsKey_Lightbeam = function () {\\n\\t\\tvar ipnsKey_Lightbeam = null\\n\\t\\tvar tiddler = $tw.wiki.getTiddler('$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-key')\\n\\t\\tif (tiddler !== undefined && tiddler !== null) {\\n\\t\\t\\tvar text = tiddler.getFieldString('text')\\n\\t\\t\\ttext =\\n\\t\\t\\t\\ttext === undefined || text == null || text.trim() === ''\\n\\t\\t\\t\\t\\t? null\\n\\t\\t\\t\\t\\t: text.trim()\\n\\t\\t\\tif (text !== null) {\\n\\t\\t\\t\\tipnsKey_Lightbeam = text\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn ipnsKey_Lightbeam\\n\\t}\\n})()\\n\",\n \"title\": \"$:/plugins/astroport/lightbeams/lightbeams-default.js\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"utils\",\n \"modified\": \"20221205142532415\",\n \"modifier\": \"Boris\"\n },\n \"$:/plugins/astroport/lightbeams/lightbeams-saver.js\": {\n \"created\": \"20221205142557663\",\n \"creator\": \"Boris\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/astroport/lightbeams/lightbeams-saver.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: saver\\n\\nLightbeam Saver\\n\\n\\\\*/\\n\\n;(function () {\\n\\t/*jslint node: true, browser: true */\\n\\t/*global $tw: false */\\n\\t'use strict'\\n\\n\\tconst log = require('$:/plugins/ipfs/loglevel/loglevel.js')\\n\\n\\tconst LightbeamsAction = require('$:/plugins/astroport/lightbeams/lightbeams-action.js').LightbeamsAction\\n\\n\\tconst ensKeyword = 'ens'\\n\\tconst ipfsKeyword = 'ipfs'\\n\\tconst ipnsKeyword = 'ipns'\\n\\n\\tconst name = 'lightbeam-saver'\\n\\n\\t/*\\n\\t * Select the appropriate saver module and set it up\\n\\t */\\n\\tvar LightbeamSaver = function (wiki) {\\n\\t\\tthis.wiki = wiki\\n\\t\\tthis.apiUrl = null\\n\\t\\tthis.ipfsProvider = null\\n\\t\\t// Loglevel\\n\\t\\tif (window.log === undefined || window.log == null) {\\n\\t\\t\\t// Init\\n\\t\\t\\twindow.log = log.noConflict()\\n\\t\\t\\tif ($tw.utils.getIpfsVerbose()) {\\n\\t\\t\\t\\tlog.setLevel('info', false)\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tlog.setLevel('warn', false)\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tthis.lightbeamsAction = new LightbeamsAction()\\n\\t\\t// Init\\n\\t\\tthis.lightbeamsAction.init()\\n\\t}\\n\\n\\tLightbeamSaver.prototype.getLogger = function () {\\n\\t\\treturn window.log.getLogger(name)\\n\\t}\\n\\n\\tLightbeamSaver.prototype.save = async function (text, method, callback, options) {\\n\\t\\t\\n\\t\\tconsole.log('Entering Lightbeams saver…')\\n\\n\\t\\tif ($tw.saverHandler.isDirty() === false) {\\n\\t\\t\\treturn false\\n\\t\\t}\\n\\t\\ttry {\\n\\t\\t\\t\\n\\t\\t\\t$tw.wiki.deleteTiddler('$:/plugins/astroport/lightbeams/myFeed')\\n\\n\\t\\t\\tlet daysLimit = 14\\n\\t\\t\\tlet maxItemsNb = 20\\n\\n\\t\\t\\tlet now = new Date()\\n\\t\\t\\tlet dateLimit = new Date()\\n\\n\\t\\t\\tdateLimit.setDate(now.getDate() - daysLimit)\\n\\t\\t\\t\\n\\t\\t\\tlet dateLimitStr = \\n\\t\\t\\t\\t dateLimit.getFullYear().toString() \\n\\t\\t\\t\\t+ (dateLimit.getMonth() + 1).toString().padStart(2,0)\\n\\t\\t\\t\\t+ (dateLimit.getDate() + 1).toString().padStart(2,0)\\n\\t\\t\\t\\t+ dateLimit.getHours().toString().padStart(2,0)\\n\\t\\t\\t\\t+ dateLimit.getMinutes().toString().padStart(2,0)\\n\\t\\t\\t\\t+ dateLimit.getSeconds().toString().padStart(2,0)\\n\\t\\t\\t\\t+ dateLimit.getMilliseconds().toString().padStart(3,0)\\n\\n\\t\\t\\tlet jsonFeed = $tw.wiki.getTiddlersAsJson('[all[tiddlers]!is[system]!sort[created]] :filter[get[created]compare:string:gteq['+ dateLimitStr +']] +[limit['+ maxItemsNb +']]')\\n\\t\\t\\tlet ipnsKey_Lightbeam = $tw.utils.getIpfsIpnsKey_Lightbeam()\\n\\t\\t\\tlet ipnsName_Lightbeam = $tw.utils.getIpfsIpnsName_Lightbeam()\\n\\n\\t\\t\\tvar cid = null\\n\\t\\t\\tvar ipnsCid = null\\n\\t\\t\\tvar ipnsKey = null\\n\\t\\t\\tvar ipnsName = null\\n\\t\\t\\tvar ensDomain = null\\n\\t\\t\\tvar ensCid = null\\n\\t\\t\\tvar options = options || {}\\n\\t\\t\\tconst wiki = $tw.ipfs.getDocumentUrl()\\n\\t\\t\\tconst base = $tw.ipfs.getIpfsBaseUrl()\\n\\t\\t\\tconst nextWiki = $tw.ipfs.getUrl(wiki)\\n\\t\\t\\tnextWiki.protocol = base.protocol\\n\\t\\t\\tnextWiki.host = base.host\\n\\t\\t\\tnextWiki.port = base.port\\n\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tvar { cid, ipnsKey } = await $tw.ipfs.resolveUrl(false, true, wiki)\\n\\t\\t\\t\\tif (cid != null) {\\n\\t\\t\\t\\t\\tawait $tw.ipfs.requestToUnpin(cid)\\n\\t\\t\\t\\t}\\n\\t\\t\\t} catch (error) {\\n\\t\\t\\t\\tthis.getLogger().error(error)\\n\\t\\t\\t\\tcallback(error.message)\\n\\t\\t\\t\\treturn true\\n\\t\\t\\t}\\n\\t\\t\\t// IPNS\\n\\t\\t\\tif (ipnsKey !== null || $tw.utils.getIpfsProtocol() === ipnsKeyword) {\\n\\t\\t\\t\\t// Resolve current IPNS\\n\\t\\t\\t\\t/*\\n\\t\\t\\t\\tif (ipnsKey !== null) {\\n\\t\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t\\tvar { cid: ipnsCid, ipnsName } = await $tw.ipfs.resolveUrl(\\n\\t\\t\\t\\t\\t\\t\\ttrue,\\n\\t\\t\\t\\t\\t\\t\\tfalse,\\n\\t\\t\\t\\t\\t\\t\\twiki\\n\\t\\t\\t\\t\\t\\t)\\n\\t\\t\\t\\t\\t} catch (error) {\\n\\t\\t\\t\\t\\t\\tthis.getLogger().error(error)\\n\\t\\t\\t\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t*/\\n\\t\\t\\t\\t\\t// Default IPNS\\n\\t\\t\\t\\t\\tipnsKey = $tw.utils.getIpfsIpnsKey()\\n\\t\\t\\t\\t\\tipnsKey =\\n\\t\\t\\t\\t\\t\\tipnsKey === undefined || ipnsKey == null || ipnsKey.trim() === ''\\n\\t\\t\\t\\t\\t\\t\\t? null\\n\\t\\t\\t\\t\\t\\t\\t: ipnsKey.trim()\\n\\t\\t\\t\\t\\tipnsName = $tw.utils.getIpfsIpnsName()\\n\\t\\t\\t\\t\\tipnsName =\\n\\t\\t\\t\\t\\t\\tipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n\\t\\t\\t\\t\\t\\t\\t? null\\n\\t\\t\\t\\t\\t\\t\\t: ipnsName.trim()\\n\\t\\t\\t\\t\\tif (ipnsKey == null && ipnsName == null) {\\n\\t\\t\\t\\t\\t\\tcallback(null, 'Unknown default IPNS identifiers...')\\n\\t\\t\\t\\t\\t\\treturn true\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tthis.getLogger().info('Processing default IPNS identifiers...')\\n\\t\\t\\t\\t\\tvar identifier = ipnsKey\\n\\t\\t\\t\\t\\tif (identifier == null) {\\n\\t\\t\\t\\t\\t\\tidentifier = ipnsName\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t\\tvar { cid: ipnsCid, ipnsKey_osef, ipnsName_osef } = await $tw.ipfs.resolveUrl(\\n\\t\\t\\t\\t\\t\\t\\ttrue,\\n\\t\\t\\t\\t\\t\\t\\tfalse,\\n\\t\\t\\t\\t\\t\\t\\t`/${ipnsKeyword}/${identifier}`\\n\\t\\t\\t\\t\\t\\t)\\n\\t\\t\\t\\t\\t} catch (error) {\\n\\t\\t\\t\\t\\t\\tthis.getLogger().error(error)\\n\\t\\t\\t\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\t\\t\\t}\\n\\n\\n\\t\\t\\t\\t\\t// var identifier_Lightbeam = ipnsKey_Lightbeam\\n\\t\\t\\t\\t\\t// if (identifier_Lightbeam == null) {\\n\\t\\t\\t\\t\\t// \\tidentifier_Lightbeam = ipnsName_Lightbeam\\n\\t\\t\\t\\t\\t// }\\n\\t\\t\\t\\t\\t// \\n\\t\\t\\t\\t\\t// try {\\n\\t\\t\\t\\t\\t// \\tvar { cid: ipnsCid_Lightbeam, ipnsKey_osef, ipnsName_osef } = await $tw.ipfs.resolveUrl(\\n\\t\\t\\t\\t\\t// \\t\\ttrue,\\n\\t\\t\\t\\t\\t// \\t\\tfalse,\\n\\t\\t\\t\\t\\t// \\t\\t`/${ipnsKeyword}/${identifier_Lightbeam}`\\n\\t\\t\\t\\t\\t// \\t)\\n\\t\\t\\t\\t\\t// } catch (error) {\\n\\t\\t\\t\\t\\t// \\tthis.getLogger().error(error)\\n\\t\\t\\t\\t\\t// \\t$tw.utils.alert(name, error.message)\\n\\t\\t\\t\\t\\t// }\\n\\n\\t\\t\\t\\t//}\\n\\n\\t\\t\\t\\tif (ipnsCid != null) {\\n\\t\\t\\t\\t\\tawait $tw.ipfs.requestToUnpin(ipnsCid)\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// if (ipnsCid_Lightbeam != null) {\\n\\t\\t\\t\\t// \\tawait $tw.ipfs.requestToUnpin(ipnsCid_Lightbeam)\\n\\t\\t\\t\\t// }\\n\\t\\t\\t}\\n\\t\\t\\t// ENS\\n\\t\\t\\tif ($tw.utils.getIpfsProtocol() === ensKeyword) {\\n\\t\\t\\t\\tensDomain = $tw.utils.getIpfsEnsDomain()\\n\\t\\t\\t\\tif (ensDomain == null) {\\n\\t\\t\\t\\t\\tcallback(null, 'Undefined ENS domain...')\\n\\t\\t\\t\\t\\treturn true\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tvar { cid: ensCid } = await $tw.ipfs.resolveUrl(false, true, ensDomain)\\n\\t\\t\\t\\tif (ensCid != null) {\\n\\t\\t\\t\\t\\tawait $tw.ipfs.requestToUnpin(ensCid)\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t// Upload current document\\n\\t\\t\\tthis.getLogger().info(`Uploading wiki: ${text.length} bytes`)\\n\\t\\t\\t// Add\\n\\t\\t\\t// $tw.utils.alert(name, `Coucou avant ajout`)\\n\\t\\t\\tconst { added } = await $tw.ipfs.addToIpfs(text)\\n\\t\\t\\tconst { added : added_Lightbeam } = await $tw.ipfs.addToIpfs(jsonFeed)\\n\\n\\n\\t\\t\\t// $tw.utils.alert(name, `Coucou après ajout`)\\n\\t\\t\\t// Default next\\n\\t\\t\\tnextWiki.pathname = `/${ipfsKeyword}/${added}`\\n\\t\\t\\t// Pin\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tawait $tw.ipfs.pinToIpfs(added)\\n\\t\\t\\t} catch (error) {\\n\\t\\t\\t\\tthis.getLogger().warn(error)\\n\\t\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\t}\\n\\t\\t\\t// Pin Lightbeam\\n\\t\\t\\t// try {\\n\\t\\t\\t// \\tawait $tw.ipfs.pinToIpfs(added_Lightbeam)\\n\\t\\t\\t// } catch (error) {\\n\\t\\t\\t// \\tthis.getLogger().warn(error)\\n\\t\\t\\t// \\t$tw.utils.alert(name, error.message)\\n\\t\\t\\t// }\\n\\n\\t\\t\\t// Publish to IPNS\\n\\t\\t\\tif (ipnsKey !== null && ipnsName !== null) {\\n\\t\\t\\t\\t$tw.utils.alert(name, `Publishing IPNS names:\u003Cbr />- ${ipnsName}\u003Cbr />- ${ipnsName_Lightbeam}`)\\n\\t\\t\\t\\ttry {\\n\\n\\t\\t\\t\\t\\tawait $tw.ipfs.publishIpnsName(added_Lightbeam, ipnsKey_Lightbeam, ipnsName_Lightbeam)\\n\\t\\t\\t\\t\\t$tw.utils.alert(name, `Successfully Published IPNS name: ${ipnsName_Lightbeam}`)\\n\\n\\t\\t\\t\\t\\tawait $tw.ipfs.publishIpnsName(added, ipnsKey, ipnsName)\\n\\t\\t\\t\\t\\t$tw.utils.alert(name, `Successfully Published IPNS name: ${ipnsName}`)\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\tnextWiki.pathname = `/${ipnsKeyword}/${ipnsKey}`\\n\\n\\t\\t\\t\\t} catch (error) {\\n\\t\\t\\t\\t\\tthis.getLogger().warn(error)\\n\\t\\t\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\t\\t\\t$tw.ipfs.requestToPin(ipnsCid)\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t// Publish to ENS\\n\\t\\t\\tif ($tw.utils.getIpfsProtocol() === ensKeyword) {\\n\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t$tw.utils.alert(name, `Publishing to ENS: ${ensDomain}`)\\n\\t\\t\\t\\t\\tawait $tw.ipfs.setEns(ensDomain, added)\\n\\t\\t\\t\\t\\t// const chainId = $tw.ipfs.getChainId()\\n\\t\\t\\t\\t\\t// if (chainId !== null && chainId === 1) {\\n\\t\\t\\t\\t\\t// nextWiki.protocol = 'https:'\\n\\t\\t\\t\\t\\t// nextWiki.host = ensDomain\\n\\t\\t\\t\\t\\t// } else {\\n\\t\\t\\t\\t\\tconst { resolvedUrl } = await $tw.ipfs.resolveEns(ensDomain)\\n\\t\\t\\t\\t\\tnextWiki.protocol = resolvedUrl.protocol\\n\\t\\t\\t\\t\\tnextWiki.host = resolvedUrl.host\\n\\t\\t\\t\\t\\tnextWiki.pathname = resolvedUrl.pathname\\n\\t\\t\\t\\t\\t// }\\n\\t\\t\\t\\t\\t$tw.utils.alert(name, `Successfully published to ENS: ${ensDomain}`)\\n\\t\\t\\t\\t} catch (error) {\\n\\t\\t\\t\\t\\tthis.getLogger().warn(error)\\n\\t\\t\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\t\\t\\t$tw.ipfs.requestToPin(ensCid)\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t$tw.ipfs.pin = []\\n\\t\\t\\t// Unpin\\n\\t\\t\\tif ($tw.utils.getIpfsUnpin()) {\\n\\t\\t\\t\\tfor (var i in $tw.ipfs.unpin) {\\n\\t\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t\\tconst unpin = $tw.ipfs.unpin[i]\\n\\t\\t\\t\\t\\t\\tawait $tw.ipfs.unpinFromIpfs(unpin)\\n\\t\\t\\t\\t\\t} catch (error) {\\n\\t\\t\\t\\t\\t\\tthis.getLogger().warn(error)\\n\\t\\t\\t\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t$tw.ipfs.unpin = []\\n\\t\\t\\t// Pin\\n\\t\\t\\tfor (var i in $tw.ipfs.pin) {\\n\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\tconst pin = $tw.ipfs.pin[i]\\n\\t\\t\\t\\t\\tawait $tw.ipfs.pinToIpfs(pin)\\n\\t\\t\\t\\t} catch (error) {\\n\\t\\t\\t\\t\\tthis.getLogger().warn(error)\\n\\t\\t\\t\\t\\t$tw.utils.alert(name, error.message)\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tcallback(null)\\n\\t\\t\\tif (nextWiki.host !== wiki.host || nextWiki.pathname !== wiki.pathname) {\\n\\t\\t\\t\\twindow.location.assign(nextWiki.toString())\\n\\t\\t\\t}\\n\\t\\t} catch (error) {\\n\\t\\t\\tthis.getLogger().error(error)\\n\\t\\t\\tcallback(error.message)\\n\\t\\t\\treturn true\\n\\t\\t}\\n\\t\\tcallback(null)\\n\\t\\treturn true\\n\\t}\\n\\n\\t/*\\n\\t * Information about this saver\\n\\t */\\n\\tLightbeamSaver.prototype.info = {\\n\\t\\tname: 'Astroport :: Lightbeams',\\n\\t\\tpriority: 3100,\\n\\t\\tcapabilities: ['save']\\n\\t}\\n\\n\\t/*\\n\\t * Static method that returns true if this saver is capable of working\\n\\t */\\n\\texports.canSave = function (wiki) {\\n\\t\\treturn true\\n\\t}\\n\\n\\t/*\\n\\t * Create an instance of this saver\\n\\t */\\n\\texports.create = function (wiki) {\\n\\t\\treturn new LightbeamSaver(wiki)\\n\\t}\\n})()\\n\",\n \"title\": \"$:/plugins/astroport/lightbeams/lightbeams-saver.js\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"saver\",\n \"modified\": \"20221206123150589\",\n \"modifier\": \"Boris\"\n },\n \"$:/plugins/astroport/lightbeams/Buttons/Homefeed\": {\n \"created\": \"20221130140514338\",\n \"creator\": \"Boris\",\n \"text\": \"\\\\whitespace trim\\n\u003Cspan class=\\\"tc-popup-keep\\\">\\n\u003C$button tooltip=\\\"Aller au fil d'actualité\\\" class=\u003C\u003Ctv-config-toolbar-class>> selectedClass=\\\"tc-selected\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/storyview-classic}}\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text=\\\"Fil d'actualité\\\" />\u003C/span>\\n\u003C/$list>\\n\\n\u003C$action-sendmessage $message=\\\"tm-close-all-tiddlers\\\" />\\n\\n\u003C$action-navigate $to=\\\"$:/plugins/astroport/lightbeams/HomeFeed\\\" $scroll=\\\"no\\\" />\\n\\n\u003C/$button>\\n\u003C/span>\",\n \"title\": \"$:/plugins/astroport/lightbeams/Buttons/Homefeed\",\n \"caption\": \"{{$:/core/images/preview-open}} Homefeed\",\n \"description\": \"Affiche le fil d'actualités\",\n \"modified\": \"20221205163015472\",\n \"modifier\": \"Boris\",\n \"tags\": \"$:/tags/PageControls\"\n },\n \"$:/plugins/astroport/lightbeams/ControlPanel/Saving/Astroport :: Lightbeams\": {\n \"created\": \"20221205092311632\",\n \"creator\": \"Boris\",\n \"text\": \"\\\\define lingo-base() $:/language/ControlPanel/Saving/IpfsService/\\n\\\\define service-name() Lightbeams\\n\\n\\n\\n\u003Cfieldset>\\n\\t\u003Clegend>\\n\\t\\tAbonnements\\n\\t\u003C/legend>\\n\\n\\n\\t\u003Cp>\\n\\t\\t\u003C$edit-text tiddler=\\\"$:/plugins/astroport/lightbeams/state/subscriptions\\\" class=\\\"tc-edit-texteditor\\\" default=\\\"\\\" tag=\\\"textarea\\\"/>\\n\\t\u003C/p>\\n\u003C/fieldset>\\n\\n\\n\u003Cfieldset>\\n\\t\u003Clegend>\\n\\t\\tLightbeam :: adresse de publication du flux JSON\\n\\t\u003C/legend>\\n\\n\\t\u003Cp>\\n\\t\\t\u003Clabel>\\n\\t\\t\\t\u003C$link to=\\\"$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-name\\\">\\n\\t\\t\\t\\t\u003C\u003Clingo IpnsName>>\\n\\t\\t\\t\u003C/$link>\\n\\t\\t\\t\u003C$edit-text tiddler=\\\"$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-name\\\" class=\\\"tc-edit-texteditor\\\" default=\\\"\\\" tag=\\\"input\\\"/>\\n\\t\\t\u003C/label>\\n\\t\\t\u003Clabel>\\n\\t\\t\\t\u003C$link to=\\\"$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-key\\\">\\n\\t\\t\\t\\t\u003C\u003Clingo IpnsKey>>\\n\\t\\t\\t\u003C/$link>\\n\\t\\t\\t\u003C$text text={{$:/plugins/astroport/lightbeams/saver/ipns/lightbeam-key}} class=\\\"tc-edit-texteditor\\\"/>\\n\\t\\t\u003C/label>\\n\\t\u003C/p>\\n\\n\\n\\t\u003Cdiv style=\\\"display: flex; flex-direction: row; margin: auto; justify-content: space-evenly;\\\">\\n\\n\\t\\t\u003C$button message=\\\"tm-lightbeam-ipns-rename\\\" tooltip={{$:/language/Buttons/Ipns/Rename/Hint}} aria-label={{$:/language/Buttons/Ipns/Rename/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n\\t\\t\\t\\t{{$:/core/images/mono-line}}\\n\\t\\t\\t\u003C/$list>\\n\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\\t\\t\\t\\t\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Rename/Caption}}/>\u003C/span>\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\u003C/$button>\\n\\n\\t\\t\u003C$button message=\\\"tm-lightbeam-ipns-generate\\\" tooltip={{$:/language/Buttons/Ipns/Generate/Hint}} aria-label={{$:/language/Buttons/Ipns/Generate/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n\\t\\t\\t\\t{{$:/core/images/new-here-button}}\\n\\t\\t\\t\u003C/$list>\\n\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\\t\\t\\t\\t\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Generate/Caption}}/>\u003C/span>\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\u003C/$button>\\n\\n\\t\\t\u003C$button message=\\\"tm-lightbeam-ipns-remove\\\" tooltip={{$:/language/Buttons/Ipns/Remove/Hint}} aria-label={{$:/language/Buttons/Ipns/Remove/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n\\t\\t\\t\\t{{$:/core/images/delete-button}}\\n\\t\\t\\t\u003C/$list>\\n\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\\t\\t\\t\\t\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Remove/Caption}}/>\u003C/span>\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\u003C/$button>\\n\\n\\t\\t\u003C$button message=\\\"tm-lightbeam-ipns-fetch\\\" tooltip={{$:/language/Buttons/Ipns/Fetch/Hint}} aria-label={{$:/language/Buttons/Ipns/Fetch/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n\\t\\t\\t\\t{{$:/core/images/refresh-button}}\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\\t\\t\\t\\t\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Fetch/Caption}}/>\u003C/span>\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\u003C/$button>\\n\\n\\t\\t\u003C$button message=\\\"tm-lightbeam-ipns-resolve-and-open\\\" tooltip={{$:/language/Buttons/Ipns/Resolve/And/Open/Hint}} aria-label={{$:/language/Buttons/Ipns/Resolve/And/Open/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n\\t\\t\\t\\t{{$:/core/images/globe}}\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\\t\\t\\t\\t\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Resolve/And/Open/Caption}}/>\u003C/span>\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\u003C/$button>\\n\\n\\t\u003C/div>\\n\u003C/fieldset>\\n\\n\u003Cfieldset>\\n\\t\u003Clegend>\\n\\t\\tTiddlyWiki :: adresse de publication de l'HTML\\n\\t\u003C/legend>\\n\\n\\t\u003Cp>\\n\\t\\t\u003Clabel>\\n\\t\\t\\t\u003C$link to=\\\"$:/ipfs/saver/ipns/name\\\">\\n\\t\\t\\t\\t\u003C\u003Clingo IpnsName>>\\n\\t\\t\\t\u003C/$link>\\n\\t\\t\\t\u003C$edit-text tiddler=\\\"$:/ipfs/saver/ipns/name\\\" class=\\\"tc-edit-texteditor\\\" default=\\\"\\\" tag=\\\"input\\\"/>\\n\\t\\t\u003C/label>\\n\\t\\t\u003Clabel>\\n\\t\\t\\t\u003C$link to=\\\"$:/ipfs/saver/ipns/key\\\">\\n\\t\\t\\t\\t\u003C\u003Clingo IpnsKey>>\\n\\t\\t\\t\u003C/$link>\\n\\t\\t\\t\u003C$text text={{$:/ipfs/saver/ipns/key}} class=\\\"tc-edit-texteditor\\\"/>\\n\\t\\t\u003C/label>\\n\\t\u003C/p>\\n\\n\\n\\t\u003Cdiv style=\\\"display: flex; flex-direction: row; margin: auto; justify-content: space-evenly;\\\">\\n\\n\\t\\t\u003C$button message=\\\"tm-ipns-rename\\\" tooltip={{$:/language/Buttons/Ipns/Rename/Hint}} aria-label={{$:/language/Buttons/Ipns/Rename/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n\\t\\t\\t\\t{{$:/core/images/mono-line}}\\n\\t\\t\\t\u003C/$list>\\n\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\\t\\t\\t\\t\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Rename/Caption}}/>\u003C/span>\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\u003C/$button>\\n\\n\\t\\t\\t\u003C$button message=\\\"tm-ipns-generate\\\" tooltip={{$:/language/Buttons/Ipns/Generate/Hint}} aria-label={{$:/language/Buttons/Ipns/Generate/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n\\t\\t\\t\\t{{$:/core/images/new-here-button}}\\n\\t\\t\\t\u003C/$list>\\n\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\\t\\t\\t\\t\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Generate/Caption}}/>\u003C/span>\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\u003C/$button>\\n\\n\\t\\t\u003C$button message=\\\"tm-ipns-remove\\\" tooltip={{$:/language/Buttons/Ipns/Remove/Hint}} aria-label={{$:/language/Buttons/Ipns/Remove/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n\\t\\t\\t\\t{{$:/core/images/delete-button}}\\n\\t\\t\\t\u003C/$list>\\n\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\\t\\t\\t\\t\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Remove/Caption}}/>\u003C/span>\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\u003C/$button>\\n\\n\\t\\t\u003C$button message=\\\"tm-ipns-fetch\\\" tooltip={{$:/language/Buttons/Ipns/Fetch/Hint}} aria-label={{$:/language/Buttons/Ipns/Fetch/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n\\t\\t\\t\\t{{$:/core/images/refresh-button}}\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\\t\\t\\t\\t\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Fetch/Caption}}/>\u003C/span>\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\u003C/$button>\\n\\n\\t\\t\u003C$button message=\\\"tm-ipns-resolve-and-open\\\" tooltip={{$:/language/Buttons/Ipns/Resolve/And/Open/Hint}} aria-label={{$:/language/Buttons/Ipns/Resolve/And/Open/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n\\t\\t\\t\\t{{$:/core/images/globe}}\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\\t\\t\\t\\t\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Resolve/And/Open/Caption}}/>\u003C/span>\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\u003C/$button>\\n\\n\\t\u003C/div>\\n\u003C/fieldset>\\n\\n\\n\u003Cfieldset>\\n\\t\u003Clegend>\\n\\t\\t\u003C\u003Clingo Url>>\\n\\t\u003C/legend>\\n\\n\\t\u003Clabel>\\n\\t\\t\u003C$link to=\\\"$:/ipfs/saver/api\\\">\u003C\u003Clingo ApiUrl>>\u003C/$link> :\\n\\t\\t\u003C$select tiddler=\\\"$:/ipfs/saver/api\\\" default=\\\"$:/ipfs/saver/api/https/tube.copylaradio.com/5001\\\" class=\\\"tc-edit-texteditor\\\">\\n\\t\\t\\t\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/ipfs/saver/api]!has[draft.of]]\\\">\\n\\t\\t\\t\\t\u003Coption value=\u003C\u003CcurrentTiddler>>>\\n\\t\\t\\t\\t\\t\u003C$transclude field=\\\"text\\\">\\n\\t\\t\\t\\t\\t\\t\u003C$text text=\u003C\u003CcurrentTiddler>>/>\\n\\t\\t\\t\\t\\t\u003C/$transclude>\\n\\t\\t\\t\\t\u003C/option>\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\u003C/$select>\\n\\t\u003C/label>\\n\\n\\t\u003Clabel>\\n\\t\\t\u003C$link to=\\\"$:/ipfs/saver/gateway\\\">\u003C\u003Clingo GatewayUrl>>\u003C/$link> :\\n\\t\\t\u003C$select tiddler=\\\"$:/ipfs/saver/gateway\\\" default=\\\"$:/ipfs/saver/gateway/https/tube.copylaradio.com\\\" class=\\\"tc-edit-texteditor\\\">\\n\\t\\t\\t\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/ipfs/saver/gateway]!has[draft.of]]\\\">\\n\\t\\t\\t\\t\u003Coption value=\u003C\u003CcurrentTiddler>>>\\n\\t\\t\\t\\t\\t\u003C$transclude field=\\\"text\\\">\\n\\t\\t\\t\\t\\t\\t\u003C$text text=\u003C\u003CcurrentTiddler>>/>\\n\\t\\t\\t\\t\\t\u003C/$transclude>\\n\\t\\t\\t\\t\u003C/option>\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\u003C/$select>\\n\\t\u003C/label>\\n\\n\u003C/fieldset>\\n\\n\\n\u003Cfieldset>\\n\\t\u003Clegend>\\n\\t\\tAvancé\\n\\t\u003C/legend>\\n\\n\\n\\t\u003Ch3>\\n\\t\\t\u003C$link to=\\\"$:/ipfs/saver/protocol\\\">\\n\\t\\t\\t\u003C\u003Clingo Protocol>>\\n\\t\\t\u003C/$link>\\n\\t\u003C/h3>\\n\\n\\t\u003C$radio tiddler=\\\"$:/ipfs/saver/protocol\\\" value=\\\"ipfs\\\">\\n\\t\\t\u003C\u003Clingo Protocol/Ipfs/Description>>\\n\\t\u003C/$radio>\\n\\t\u003C$radio tiddler=\\\"$:/ipfs/saver/protocol\\\" value=\\\"ipns\\\">\\n\\t\\t\u003C\u003Clingo Protocol/Ipns/Description>>\\n\\t\u003C/$radio>\\n\\n\\n\\t\u003Ch3>\\n\\t\\t\u003C\u003Clingo Global>>\\n\\t\u003C/h3>\\n\\n\\t\u003Cp>\\n\\t\\t\u003Clabel>\\n\\t\\t\\t\u003C$checkbox tiddler=\\\"$:/ipfs/saver/verbose\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"yes\\\"/>\\n\\t\\t\\t\u003C$link to=\\\"$:/ipfs/saver/verbose\\\">\u003C\u003Clingo Verbose/Description>>\u003C/$link>\\n\\t\\t\u003C/label>\\n\\t\\t\\n\\t\\t\u003Clabel>\\n\\t\\t\\t\u003C$checkbox tiddler=\\\"$:/ipfs/saver/unpin\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"no\\\"/>\\n\\t\\t\\t\u003C$link to=\\\"$:/ipfs/saver/unpin\\\">\u003C\u003Clingo Unpin/Description>>\u003C/$link>\\n\\t\\t\u003C/label>\\n\\t\u003C/p>\\n\\n\\n\\t\u003Ch3>\\n\\t\\t\u003C$link to=\\\"$:/ipfs/saver/provider\\\">\u003C\u003Clingo Provider>>\u003C/$link>\\n\\t\u003C/h3>\\n\\n\\t\u003C$radio tiddler=\\\"$:/ipfs/saver/provider\\\" value=\\\"default\\\">\u003C\u003Clingo Provider/Default/Description>>\u003C/$radio>\\n\\t\u003C$radio tiddler=\\\"$:/ipfs/saver/provider\\\" value=\\\"window\\\">\u003C\u003Clingo Provider/Window/Description>>\u003C/$radio>\\n\\t\u003C$radio tiddler=\\\"$:/ipfs/saver/provider\\\" value=\\\"http\\\">\u003C\u003Clingo Provider/HTTP/Description>>\u003C/$radio>\\n\\n\\n\\t\u003Ch3>\\n\\t\\t\u003C$link to=\\\"$:/ipfs/saver/policy\\\">\\n\\t\\t\\t\u003C\u003Clingo Policy>>\\n\\t\\t\u003C/$link>\\n\\t\u003C/h3>\\n\\n\\t\u003C$radio tiddler=\\\"$:/ipfs/saver/policy\\\" value=\\\"origin\\\">\u003C\u003Clingo Policy/Origin/Description>>\u003C/$radio>\\n\\t\u003C$radio tiddler=\\\"$:/ipfs/saver/policy\\\" value=\\\"gateway\\\">\u003C\u003Clingo Policy/Gateway/Description>>\u003C/$radio>\\n\\n\\n\\t\u003Ch3>\\n\\t\\t\u003C$link to=\\\"$:/ipfs/saver/export\\\">\\n\\t\\t\\t\u003C\u003Clingo Export>>\\n\\t\\t\u003C/$link>\\n\\t\u003C/h3>\\n\\n\\t\u003C$radio tiddler=\\\"$:/ipfs/saver/export\\\" value=\\\"json\\\">\\n\\t\\t\u003C\u003Clingo Export/Json/Description>>\\n\\t\u003C/$radio>\\n\\n\\t\u003C$radio tiddler=\\\"$:/ipfs/saver/export\\\" value=\\\"static\\\">\\n\\t\\t\u003C\u003Clingo Export/Static/Description>>\\n\\t\u003C/$radio>\\n\\n\\t\u003C$radio tiddler=\\\"$:/ipfs/saver/export\\\" value=\\\"tid\\\">\\n\\t\\t\u003C\u003Clingo Export/Tid/Description>>\\n\\t\u003C/$radio>\\n\\n\u003C/fieldset>\",\n \"title\": \"$:/plugins/astroport/lightbeams/ControlPanel/Saving/Astroport :: Lightbeams\",\n \"modified\": \"20221205151913439\",\n \"tags\": \"$:/ipfs/core $:/tags/ControlPanel/Saving\",\n \"caption\": \"Astroport :: Lightbeams\",\n \"modifier\": \"Boris\"\n },\n \"$:/plugins/astroport/lightbeams/layouts/feedable\": {\n \"created\": \"20221130141048325\",\n \"creator\": \"Boris\",\n \"text\": \"\\\\whitespace trim\\n\\\\define containerClasses()\\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\\n\\\\end\\n\\\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\\n\\n\u003C$vars\\n\\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\\n\\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\\n\\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\\n\\ttv-enable-drag-and-drop={{$:/config/DragAndDrop/Enable}}\\n\\ttv-show-missing-links={{$:/config/MissingLinks}}\\n\\tstoryviewTitle={{$:/view}}\\n\\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\\n\\n\u003Cdiv class=\u003C\u003CcontainerClasses>>>\\n\\n\u003C$transclude tiddler=\\\"$:/plugins/astroport/lightbeams/ui/HomeFeed\\\"/>\\n\\n\u003C$navigator story=\\\"$:/StoryList\\\" history=\\\"$:/HistoryList\\\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\\n\\n\u003C$dropzone enable=\u003C\u003Ctv-enable-drag-and-drop>> autoOpenOnImport=\\\"yes\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>>/>\\n\\n\u003C/$list>\\n\\n\u003C/$dropzone>\\n\\n\u003C/$navigator>\\n\\n\u003C/div>\\n\\n\u003C/$vars>\\n\",\n \"tags\": \"$:/tags/Layout\",\n \"title\": \"$:/plugins/astroport/lightbeams/layouts/feedable\",\n \"modified\": \"20221205163129833\",\n \"modifier\": \"Boris\",\n \"name\": \"Feedable\",\n \"description\": \"En mode avec un fil d'actualité\"\n },\n \"$:/plugins/astroport/lightbeams/tests/friends\": {\n \"created\": \"20221130195042105\",\n \"creator\": \"Boris\",\n \"text\": \"\u003C\u003Cfriends>>\\n\\n!! Envoyées\\n\\n\u003C$transclude tiddler=\\\"$:/plugins/astroport/lightbeams/state/stars_sendees\\\" field=\\\"text\\\" />\\n\\n!! Reçues\\n\\n\u003C$transclude tiddler=\\\"$:/plugins/astroport/lightbeams/state/stars_senders\\\" field=\\\"text\\\" />\",\n \"tags\": \"\",\n \"title\": \"$:/plugins/astroport/lightbeams/tests/friends\",\n \"modified\": \"20221204165827491\",\n \"modifier\": \"Boris\"\n },\n \"$:/plugins/astroport/lightbeams/ui/HomeFeed\": {\n \"created\": \"20221130141830129\",\n \"creator\": \"Boris\",\n \"text\": \"\u003Csection id=\\\"homefeed\\\">\\n\u003C$list filter=\\\"[list[$:/StoryList]match[$:/plugins/astroport/lightbeams/HomeFeed]]\\\" variable=\\\"null\\\">\\n\u003Ch1>Votre fil d'actus\u003C/h1>\\n\u003Cdl>\\n\u003Cdt>macrocall:\u003C/dt>\\n\u003Cdd>\u003C$macrocall $name=\\\"homefeed\\\" />\u003C/dd>\\n\u003C/dl>\\n\u003C$transclude tiddler=\\\"$:/plugins/astroport/lightbeams/myFeed\\\" />\\n\u003C/$list>\\n\u003C/section>\",\n \"tags\": \"\",\n \"title\": \"$:/plugins/astroport/lightbeams/ui/HomeFeed\",\n \"modified\": \"20221204181056753\",\n \"modifier\": \"Boris\"\n }\n }\n}","tags":"$:/isAttachment $:/isEmbedded","title":"$:/plugins/astroport/lightbeams","modified":"20231007121836980","modifier":"_PSEUDO_","type":"application/json","author":"Astroport","name":"Astroport :: Lightbeams ::","description":"send signals accross the universe","plugin-type":"plugin","version":"0.0.8"}, {"version":"2022.12.28","type":"application/json","title":"$:/plugins/Gk0Wk/CPL-Repo","plugin-type":"plugin","name":"CPL Repo","description":"Repos for CPL","author":"Gk0Wk","text":"{\"tiddlers\":{\"$:/config/TiddlyWiki-CPL/GitHub\":{\"title\":\"$:/config/TiddlyWiki-CPL/GitHub\",\"caption\":\"\u003C$list filter=\\\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]]\\\" variable=\\\"lang\\\">\u003C$list filter=\\\"[\u003Clang>search:title[zh]]\\\">太微中文社区插件源(~GitHub版)\u003C/$list>\u003C$list filter=\\\"[\u003Clang>!search:title[zh]]\\\">TiddlyWiki CPL(~GitHub Host)\u003C/$list>\u003C/$list>\",\"tags\":[\"$:/tags/PluginLibrary\",\"$:/tags/PluginLibrary/CPL\"],\"type\":\"text/vnd.tiddlywiki\",\"url\":\"https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html\",\"text\":\"\u003C!-- lang变量就是当前语言 -->\\n\u003C$list filter=\\\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]]\\\" variable=\\\"lang\\\">\\n\u003C$list filter=\\\"[\u003Clang>search:title[zh]]\\\" variable=\\\"lang\\\">\\n\\n欢迎使用''【太微中文社区插件源】''!\\n\\n本插件源是由[[太微(TiddlyWiki)中文社区|https://github.com/tiddly-gittly]]维护的、致力于搜集网络上所有与 ~TiddlyWiki5 有关插件的、希望为中国以及全世界的太微用户提供一键安装、更新插件体验的公开插件源。\\n\\n如果还不了解该如何使用太微和本插件源,欢迎阅读[[中文社区共建的太微(TiddlyWiki)教程|https://tw-cn.netlify.app]]里插件相关的部分。如上提到的插件源和教程皆为开源项目,你可以在 [[GitHub|https://github.com/tiddly-gittly]] 中找到并参与贡献!如果乐意,可以通过QQ群等方式加入我们,详情请见如上提到的中文教程。\\n\\n要添加这个插件库到你的 Wiki 中,只需鼠标拖动这个链接到你的 Wiki 里即可:\u003C$link to=\u003C\u003CcurrentTiddler>>>{{!!caption}}\u003C/$link>\\n\\n注意:本插件源版本为 ~GitHub Page 的版本,更新更快,但是可能需要科学上网手段。如果你在国内,而且不清楚什么是“科学上网”,请选用另一个经过 netlify.app 加速的[[版本|$:/config/TiddlyWiki-CPL/Netlify]],虽然更新有一定的延迟,但对国内用户更加友好。\\n\\n@@color:red;''安装任何插件前,请记得备份你的Wiki,本插件源无法为插件造成的个人损失负责!''@@\\n\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[\u003Clang>!search:title[zh]]\\\" variable=\\\"lang\\\">\\n\\nWelcome to the ''[TiddlyWiki Chinese Community Plugin Source]''!\\n\\nThis plugin source is maintained by the [[TiddlyWiki Chinese Community]] and is dedicated to collecting all TiddlyWiki5 related plugins on the web, hoping to provide a one-click installation and update plugin experience for TiddlyWiki users in China and around the world.\\n\\nIf you don't know how to use TiddlyWiki and this source, you are welcome to read the plugins related section in the [[TiddlyWiki Tutorials for Chinese Communities|https://tw-cn.netlify.app]]. As mentioned above, both the plugin source and the tutorial are open source projects, you can find them in [[GitHub|https://github.com/tiddly-gittly]] and participate in contributing! If you like, you can join us through QQ groups and other means, see the Chinese tutorials mentioned above for details.\\n\\nTo add this plugin library to your Wiki, just drag this link with your mouse into your Wiki: \u003C$link to=\u003C\u003CcurrentTiddler>>>{{!!caption}}\u003C/$link>\\n\\nNote: The source version of this plugin is the ~GitHub Page version, which is faster to update, but may require scientific Internet access. If you are in China and are not sure what GFW is, please use another [[version|$:/config/TiddlyWiki-CPL/Netlify]] that is accelerated by netlify.app, although there is a certain delay in updating, but it is more friendly to domestic users more friendly.\\n\\n@@color:red;''Please remember to back up your Wiki before installing any plugins, this plugin source cannot be held responsible for personal losses caused by plugins!''@@\\n\\n\u003C/$list>\\n\u003C/$list>\\n\"},\"$:/config/TiddlyWiki-CPL/Netlify\":{\"title\":\"$:/config/TiddlyWiki-CPL/Netlify\",\"caption\":\"\u003C$list filter=\\\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]]\\\" variable=\\\"lang\\\">\u003C$list filter=\\\"[\u003Clang>search:title[zh]]\\\">太微中文社区插件源(大陆加速版)\u003C/$list>\u003C$list filter=\\\"[\u003Clang>!search:title[zh]]\\\">TiddlyWiki CPL(Netlify Host)\u003C/$list>\u003C/$list>\",\"tags\":[\"$:/tags/PluginLibrary\",\"$:/tags/PluginLibrary/CPL\"],\"type\":\"text/vnd.tiddlywiki\",\"url\":\"https://tw-cpl.netlify.app/library/index.html\",\"text\":\"\u003C!-- lang变量就是当前语言 -->\\n\u003C$list filter=\\\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]]\\\" variable=\\\"lang\\\">\\n\u003C$list filter=\\\"[\u003Clang>search:title[zh]]\\\" variable=\\\"lang\\\">\\n\\n欢迎使用''【太微中文社区插件源】''!\\n\\n本插件源是由[[太微(TiddlyWiki)中文社区|https://github.com/tiddly-gittly]]维护的、致力于搜集网络上所有与 ~TiddlyWiki5 有关插件的、希望为中国以及全世界的太微用户提供一键安装、更新插件体验的公开插件源。\\n\\n如果还不了解该如何使用太微和本插件源,欢迎阅读[[中文社区共建的太微(TiddlyWiki)教程|https://tw-cn.netlify.app]]里插件相关的部分。如上提到的插件源和教程皆为开源项目,你可以在 [[GitHub|https://github.com/tiddly-gittly]] 中找到并参与贡献!如果乐意,可以通过QQ群等方式加入我们,详情请见如上提到的中文教程。\\n\\n要添加这个插件库到你的 Wiki 中,只需鼠标拖动这个链接到你的 Wiki 里即可:\u003C$link to=\u003C\u003CcurrentTiddler>>>{{!!caption}}\u003C/$link>\\n\\n注意:本插件源版本为经过 netlify.app 加速的版本,对国内用户更加友好,但是更新有一定的延迟。还提供另一版本,是直接使用 ~GitHub Page 服务器的版本,更新更快,但是可能需要科学上网手段。\\n\\n@@color:red;''安装任何插件前,请记得备份你的Wiki,本插件源无法为插件造成的个人损失负责!''@@\\n\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[\u003Clang>!search:title[zh]]\\\" variable=\\\"lang\\\">\\n\\nWelcome to the ''[TiddlyWiki Chinese Community Plugin Source]''!\\n\\nThis plugin source is maintained by the [[TiddlyWiki Chinese Community]] and is dedicated to collecting all TiddlyWiki5 related plugins on the web, hoping to provide a one-click installation and update plugin experience for TiddlyWiki users in China and around the world.\\n\\nIf you don't know how to use TiddlyWiki and this source, you are welcome to read the plugins related section in the [[TiddlyWiki Tutorials for Chinese Communities|https://tw-cn.netlify.app]]. As mentioned above, both the plugin source and the tutorial are open source projects, you can find them in [[GitHub|https://github.com/tiddly-gittly]] and participate in contributing! If you like, you can join us through QQ groups and other means, see the Chinese tutorials mentioned above for details.\\n\\nTo add this plugin library to your Wiki, just drag this link with your mouse into your Wiki: \u003C$link to=\u003C\u003CcurrentTiddler>>>{{!!caption}}\u003C/$link>\\n\\nNote: The source version of this plugin is a version accelerated by netlify.app, which is more friendly to China mainland users, but there is a delay in updating. There is also another version that uses the GitHub Page server directly, which is faster to update, but may require technology to overturn the GFW.\\n\\n@@color:red;''Please remember to back up your Wiki before installing any plugins, this plugin source cannot be held responsible for personal losses caused by plugins!''@@\\n\\n\u003C/$list>\\n\u003C/$list>\\n\"}}}","modified":"20231007121836980","modifier":"_PSEUDO_","tags":"$:/isAttachment $:/isEmbedded _PLAYER_"}, +{"author":"Gk0Wk","dependents":"","description":"draw.io powerful diagram editor for TiddlyWiki","list":"readme config LICENSE","name":"draw.io","plugin-type":"plugin","text":"{\"tiddlers\":{\"$:/config/EditorTypeMappings/text/x-drawio\":{\"title\":\"$:/config/EditorTypeMappings/text/x-drawio\",\"text\":\"drawio\"},\"$:/config/EditorTypeMappings/application/vnd.drawio\":{\"title\":\"$:/config/EditorTypeMappings/application/vnd.drawio\",\"text\":\"drawio\"},\"$:/config/EditorTypeMappings/application/x-drawio\":{\"title\":\"$:/config/EditorTypeMappings/application/x-drawio\",\"text\":\"drawio\"},\"$:/plugins/Gk0Wk/drawio/LICENSE\":{\"title\":\"$:/plugins/Gk0Wk/drawio/LICENSE\",\"type\":\"text/plain\",\"text\":\"\\nMIT License\\n\\nCopyright (c) 2023 Gk0Wk(nmg_wk@yeah.net)\\n\\nPermission is hereby granted, free of charge, to any person obtaining a copy\\nof this software and associated documentation files (the \\\"Software\\\"), to deal\\nin the Software without restriction, including without limitation the rights\\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\ncopies of the Software, and to permit persons to whom the Software is\\nfurnished to do so, subject to the following conditions:\\n\\nThe above copyright notice and this permission notice shall be included in all\\ncopies or substantial portions of the Software.\\n\\nTHE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\nSOFTWARE.\\n\"},\"$:/plugins/Gk0Wk/drawio/base64.min.js\":{\"title\":\"$:/plugins/Gk0Wk/drawio/base64.min.js\",\"text\":\"/**\\n * Minified by jsDelivr using Terser v5.15.1.\\n * Original file: /npm/js-base64@3.7.5/base64.js\\n *\\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\\n */\\n!function(t,n){var r,e;\\\"object\\\"==typeof exports&&\\\"undefined\\\"!=typeof module?module.exports=n():\\\"function\\\"==typeof define&&define.amd?define(n):(r=t.Base64,(e=n()).noConflict=function(){return t.Base64=r,e},t.Meteor&&(Base64=e),t.Base64=e)}(\\\"undefined\\\"!=typeof self?self:\\\"undefined\\\"!=typeof window?window:\\\"undefined\\\"!=typeof global?global:this,(function(){\\\"use strict\\\";var t,n=\\\"3.7.5\\\",r=\\\"function\\\"==typeof atob,e=\\\"function\\\"==typeof btoa,o=\\\"function\\\"==typeof Buffer,u=\\\"function\\\"==typeof TextDecoder?new TextDecoder:void 0,i=\\\"function\\\"==typeof TextEncoder?new TextEncoder:void 0,f=Array.prototype.slice.call(\\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\\"),c=(t={},f.forEach((function(n,r){return t[n]=r})),t),a=/^(?:[A-Za-z\\\\d+\\\\/]{4})*?(?:[A-Za-z\\\\d+\\\\/]{2}(?:==)?|[A-Za-z\\\\d+\\\\/]{3}=?)?$/,d=String.fromCharCode.bind(String),s=\\\"function\\\"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):function(t){return new Uint8Array(Array.prototype.slice.call(t,0))},l=function(t){return t.replace(/=/g,\\\"\\\").replace(/[+\\\\/]/g,(function(t){return\\\"+\\\"==t?\\\"-\\\":\\\"_\\\"}))},h=function(t){return t.replace(/[^A-Za-z0-9\\\\+\\\\/]/g,\\\"\\\")},p=function(t){for(var n,r,e,o,u=\\\"\\\",i=t.length%3,c=0;c\u003Ct.length;){if((r=t.charCodeAt(c++))>255||(e=t.charCodeAt(c++))>255||(o=t.charCodeAt(c++))>255)throw new TypeError(\\\"invalid character found\\\");u+=f[(n=r\u003C\u003C16|e\u003C\u003C8|o)>>18&63]+f[n>>12&63]+f[n>>6&63]+f[63&n]}return i?u.slice(0,i-3)+\\\"===\\\".substring(i):u},y=e?function(t){return btoa(t)}:o?function(t){return Buffer.from(t,\\\"binary\\\").toString(\\\"base64\\\")}:p,A=o?function(t){return Buffer.from(t).toString(\\\"base64\\\")}:function(t){for(var n=[],r=0,e=t.length;r\u003Ce;r+=4096)n.push(d.apply(null,t.subarray(r,r+4096)));return y(n.join(\\\"\\\"))},b=function(t,n){return void 0===n&&(n=!1),n?l(A(t)):A(t)},g=function(t){if(t.length\u003C2)return(n=t.charCodeAt(0))\u003C128?t:n\u003C2048?d(192|n>>>6)+d(128|63&n):d(224|n>>>12&15)+d(128|n>>>6&63)+d(128|63&n);var n=65536+1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320);return d(240|n>>>18&7)+d(128|n>>>12&63)+d(128|n>>>6&63)+d(128|63&n)},B=/[\\\\uD800-\\\\uDBFF][\\\\uDC00-\\\\uDFFFF]|[^\\\\x00-\\\\x7F]/g,x=function(t){return t.replace(B,g)},C=o?function(t){return Buffer.from(t,\\\"utf8\\\").toString(\\\"base64\\\")}:i?function(t){return A(i.encode(t))}:function(t){return y(x(t))},m=function(t,n){return void 0===n&&(n=!1),n?l(C(t)):C(t)},v=function(t){return m(t,!0)},U=/[\\\\xC0-\\\\xDF][\\\\x80-\\\\xBF]|[\\\\xE0-\\\\xEF][\\\\x80-\\\\xBF]{2}|[\\\\xF0-\\\\xF7][\\\\x80-\\\\xBF]{3}/g,F=function(t){switch(t.length){case 4:var n=((7&t.charCodeAt(0))\u003C\u003C18|(63&t.charCodeAt(1))\u003C\u003C12|(63&t.charCodeAt(2))\u003C\u003C6|63&t.charCodeAt(3))-65536;return d(55296+(n>>>10))+d(56320+(1023&n));case 3:return d((15&t.charCodeAt(0))\u003C\u003C12|(63&t.charCodeAt(1))\u003C\u003C6|63&t.charCodeAt(2));default:return d((31&t.charCodeAt(0))\u003C\u003C6|63&t.charCodeAt(1))}},w=function(t){return t.replace(U,F)},S=function(t){if(t=t.replace(/\\\\s+/g,\\\"\\\"),!a.test(t))throw new TypeError(\\\"malformed base64.\\\");t+=\\\"==\\\".slice(2-(3&t.length));for(var n,r,e,o=\\\"\\\",u=0;u\u003Ct.length;)n=c[t.charAt(u++)]\u003C\u003C18|c[t.charAt(u++)]\u003C\u003C12|(r=c[t.charAt(u++)])\u003C\u003C6|(e=c[t.charAt(u++)]),o+=64===r?d(n>>16&255):64===e?d(n>>16&255,n>>8&255):d(n>>16&255,n>>8&255,255&n);return o},E=r?function(t){return atob(h(t))}:o?function(t){return Buffer.from(t,\\\"base64\\\").toString(\\\"binary\\\")}:S,D=o?function(t){return s(Buffer.from(t,\\\"base64\\\"))}:function(t){return s(E(t).split(\\\"\\\").map((function(t){return t.charCodeAt(0)})))},R=function(t){return D(T(t))},z=o?function(t){return Buffer.from(t,\\\"base64\\\").toString(\\\"utf8\\\")}:u?function(t){return u.decode(D(t))}:function(t){return w(E(t))},T=function(t){return h(t.replace(/[-_]/g,(function(t){return\\\"-\\\"==t?\\\"+\\\":\\\"/\\\"})))},Z=function(t){return z(T(t))},j=function(t){return{value:t,enumerable:!1,writable:!0,configurable:!0}},I=function(){var t=function(t,n){return Object.defineProperty(String.prototype,t,j(n))};t(\\\"fromBase64\\\",(function(){return Z(this)})),t(\\\"toBase64\\\",(function(t){return m(this,t)})),t(\\\"toBase64URI\\\",(function(){return m(this,!0)})),t(\\\"toBase64URL\\\",(function(){return m(this,!0)})),t(\\\"toUint8Array\\\",(function(){return R(this)}))},O=function(){var t=function(t,n){return Object.defineProperty(Uint8Array.prototype,t,j(n))};t(\\\"toBase64\\\",(function(t){return b(this,t)})),t(\\\"toBase64URI\\\",(function(){return b(this,!0)})),t(\\\"toBase64URL\\\",(function(){return b(this,!0)}))},P={version:n,VERSION:\\\"3.7.5\\\",atob:E,atobPolyfill:S,btoa:y,btoaPolyfill:p,fromBase64:Z,toBase64:m,encode:m,encodeURI:v,encodeURL:v,utob:x,btou:w,decode:Z,isValid:function(t){if(\\\"string\\\"!=typeof t)return!1;var n=t.replace(/\\\\s+/g,\\\"\\\").replace(/={0,2}$/,\\\"\\\");return!/[^\\\\s0-9a-zA-Z\\\\+/]/.test(n)||!/[^\\\\s0-9a-zA-Z\\\\-_]/.test(n)},fromUint8Array:b,toUint8Array:R,extendString:I,extendUint8Array:O,extendBuiltins:function(){I(),O()},Base64:{}};return Object.keys(P).forEach((function(t){return P.Base64[t]=P[t]})),P}));\\n\",\"type\":\"application/javascript\",\"source\":\"https://www.npmjs.com/package/js-base64\",\"module-type\":\"library\",\"Modern.TiddlyDev#Minify\":\"false\"},\"$:/plugins/Gk0Wk/drawio/config/theme-light\":{\"title\":\"$:/plugins/Gk0Wk/drawio/config/theme-light\",\"text\":\"Kennedy\"},\"$:/plugins/Gk0Wk/drawio/config/theme-dark\":{\"title\":\"$:/plugins/Gk0Wk/drawio/config/theme-dark\",\"text\":\"dark\"},\"$:/plugins/Gk0Wk/drawio/config\":{\"title\":\"$:/plugins/Gk0Wk/drawio/config\",\"tags\":\"$:/tags/ControlPanel/SettingsTab\",\"type\":\"text/vnd.tiddlywiki\",\"caption\":\"draw.io\",\"list-after\":\"$:/core/ui/ControlPanel/Settings/TiddlyWiki\",\"text\":\"\\\\define theme-selector(tiddler)\\n$tiddler$\\n\u003C$select tiddler=\\\"$tiddler$\\\" default=\\\"Kennedy\\\">\\n\u003C$list filter=\\\"[[Kennedy dark min simple atlas sketch]split[ ]unique[]]\\\">\\n\u003Coption value=\u003C\u003CcurrentTiddler>>>\u003C$text text=\u003C\u003CcurrentTiddler>>/>\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\\n\\\\end\\n\\n\u003C$list filter=\\\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]]\\\" variable=\\\"lang\\\">\\n\u003C$list filter=\\\"[\u003Clang>search[zh]]\\\">\\n\\n!! 主题\\n\\n; 日间模式所使用的主题\\n: \u003C\u003Ctheme-selector tiddler:\\\"$:/plugins/Gk0Wk/drawio/config/theme-light\\\" >>\\n\\n; 夜间模式所使用的主题\\n: \u003C\u003Ctheme-selector tiddler:\\\"$:/plugins/Gk0Wk/drawio/config/theme-dark\\\" >>\\n\\n> 不同的主题的样式可以参考[[官网文档|https://www.drawio.com/blog/diagram-editor-theme]]。\\n\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[\u003Clang>!search[zh]]\\\">\\n\\n!! Themes\\n\\n; Theme used for light mode\\n: \u003C\u003Ctheme-selector tiddler:\\\"$:/plugins/Gk0Wk/drawio/config/theme-light\\\" >>\\n\\n; Theme used for dark mode\\n: \u003C\u003Ctheme-selector tiddler:\\\"$:/plugins/Gk0Wk/drawio/config/theme-dark\\\" >>\\n\\n> Different themes can be found in the [[official documentation|https://www.drawio.com/blog/diagram-editor-theme]].\\n\\n\u003C/$list>\\n\u003C/$list>\\n\"},\"$:/plugins/Gk0Wk/drawio/icon\":{\"title\":\"$:/plugins/Gk0Wk/drawio/icon\",\"text\":\"{{$:/plugins/Gk0Wk/drawio/new-drawio-diagram-icon}}\\n\"},\"$:/plugins/Gk0Wk/drawio/new-drawio-diagram-icon\":{\"title\":\"$:/plugins/Gk0Wk/drawio/new-drawio-diagram-icon\",\"tags\":\"$:/tags/Image\",\"text\":\"\u003Csvg viewBox=\\\"-156 -86 205.81093 214.63753\\\" width=\\\"22pt\\\" height=\\\"22pt\\\">\\n \u003Cg fill-rule=\\\"evenodd\\\">\\n \u003Cpath d=\\\"M 7.510919 104.83754 L 7.510919 123.63753 C 7.510919 126.39895 9.749495 128.63753 12.510919 128.63753 L 21.01092 128.63753 C 23.772343 128.63753 26.01092 126.39895 26.01092 123.63753 L 26.01092 104.83754 L 44.81093 104.83754 C 47.57235 104.83754 49.81093 102.59896 49.81093 99.83754 L 49.81093 91.83754 C 49.81093 89.07611 47.57235 86.83754 44.81093 86.83754 L 26.01092 86.83754 L 26.01092 67.63753 C 26.01092 64.87611 23.772343 62.63753 21.01092 62.63753 L 12.510919 62.63753 C 9.749495 62.63753 7.510919 64.87611 7.510919 67.63753 L 7.510919 86.83754 L -11.789074 86.83754 C -14.550497 86.83754 -16.789074 89.07611 -16.789074 91.83754 L -16.789074 99.83754 C -16.789074 102.59896 -14.550497 104.83754 -11.789074 104.83754 Z M -59.01476 -83.85373 L -59.01476 -83.85373 C -59.01476 -83.85373 -59.01476 -83.85373 -59.01476 -83.85373 C -66.667444 -88.27201 -76.45289 -85.65001 -80.87117 -77.99733 L -153.85373 48.412184 C -158.27201 56.064866 -155.65001 65.85031 -147.99733 70.26859 L -62.87887 119.41176 C -55.22619 123.83003 -45.44074 121.20803 -41.022464 113.55535 L 31.960102 -12.854164 C 31.960102 -12.854164 31.960102 -12.854164 31.960102 -12.854164 C 36.37838 -20.506846 33.756378 -30.292292 26.103696 -34.71057 L -59.01476 -83.85373 Z M -65.25693 .4979554 L -65.25693 .4979554 C -67.29688 -1.7634792 -67.587825 -5.513017 -65.74699 -8.701437 L -56.532335 -24.661687 C -54.31968 -28.494123 -49.86498 -30.064607 -46.582494 -28.169462 L -28.306324 -17.61771 C -25.023836 -15.722565 -24.156567 -11.079443 -26.369225 -7.247007 L -35.58388 8.713242 C -37.42618 11.904203 -40.82279 13.527054 -43.802935 12.887011 L -45.53852 41.13174 L -35.201383 47.09989 C -31.918895 48.995036 -31.051627 53.63816 -33.264284 57.470594 L -42.47894 73.43084 C -44.691597 77.26328 -49.14629 78.83376 -52.42878 76.93862 L -70.70495 66.38687 C -73.98744 64.49172 -74.85471 59.8486 -72.64205 56.016164 L -63.427394 40.055914 C -61.214736 36.22348 -56.76004 34.652994 -53.47755 36.54814 L -51.85793 37.48323 C -51.48697 30.840904 -50.63306 15.47325 -50.334974 9.449013 L -59.0156 4.437249 C -64.0837 7.707519 -76.96553 16.130853 -82.53247 19.773275 L -80.93599 20.695003 C -77.6535 22.590148 -76.78623 27.23327 -78.99889 31.065705 L -88.21355 47.025955 C -90.4262 50.85839 -94.8809 52.428875 -98.16339 50.53373 L -116.43956 39.98198 C -119.72205 38.086833 -120.58931 33.44371 -118.37666 29.611276 L -109.162 13.651026 C -106.94934 9.81859 -102.49465 8.248106 -99.21216 10.143251 L -88.85188 16.124764 L -65.25693 .4979554 L -65.25693 .4979554 Z\\\" />\\n \u003C/g>\\n\u003C/svg>\\n\"},\"$:/plugins/Gk0Wk/drawio/new-drawio-diagram\":{\"title\":\"$:/plugins/Gk0Wk/drawio/new-drawio-diagram\",\"tags\":\"$:/tags/PageControls $:/tags/ViewToolbar\",\"hint\":\"\u003C$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[新建一个draw.io图表条目]else[Create a new draw.io diagram tiddler]] }}} />\",\"description\":\"\u003C$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[新建一个draw.io图表条目]else[Create a new draw.io diagram tiddler]] }}} />\",\"caption\":\"{{$:/plugins/Gk0Wk/drawio/new-drawio-diagram-icon}} \u003C$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[新建图表]else[new diagram]] }}} />\",\"text\":\"\\\\whitespace trim\\n\\n\\\\define createDiagram()\\n\u003C$action-createtiddler $basetitle={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[图表]else[Diagram]] }}} type=\\\"application/vnd.drawio\\\" >\\n\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param=\u003C\u003CcreateTiddler-title>>/>\\n\u003C/$action-createtiddler>\\n\\\\end\\n\\n\\\\define drawioButton()\\n\\\\whitespace trim\\n\u003C$button tooltip={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[新建一个draw.io图表条目]else[Create a new draw.io diagram tiddler]] }}} aria-label={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[新建图表]else[new diagram]] }}} class=\u003C\u003Ctv-config-toolbar-class>> actions=\u003C\u003CcreateDiagram>> >\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/plugins/Gk0Wk/drawio/new-drawio-diagram-icon}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{{ [[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]search[zh]then[新建图表]else[new diagram]] }}} />\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\\\\end\\n\\n\u003C\u003CdrawioButton>>\\n\"},\"$:/plugins/Gk0Wk/drawio/readme\":{\"title\":\"$:/plugins/Gk0Wk/drawio/readme\",\"type\":\"text/vnd.tiddlywiki\",\"caption\":\"draw.io\",\"text\":\"\u003Cimg src=\\\"https://www.drawio.com/assets/img/blog/feature-flag-gitflow-tags.png\\\" width=\\\"100%\\\" height=\\\"auto\\\" >\\n\\n\u003C$list filter=\\\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]]\\\" variable=\\\"lang\\\">\\n\u003C$list filter=\\\"[\u003Clang>search[zh]]\\\">\\n\\ndraw.io 是一个强大的在线图表编辑器,可以用来绘制流程图、组织结构图、UML图、网络图、平面图、电路图、数据库图、房屋平面图、地图等等。\\n\\n现在我将其集成到了 \u003C$text text=\\\"TiddlyWiki\\\" /> 中,你可以在这里使用它。点击 {{$:/plugins/Gk0Wk/drawio/new-drawio-diagram-icon}} 按钮,就可以创建一个新的图表条目,该条目在非编辑模式下会显示其绘制的内容,而在编辑模式下则会进入 draw.io 的编辑界面。\\n\\n注意:编辑模式需要联网才能使用,因为 draw.io 是在线编辑器,初次加载需要一定的时间,所以请耐心等待。但是预览图片不需要联网,所以你可以在离线状态下查看图表,此时它和你其他的图片没有区别。\\n\\n你可以在插件的设置中修改编辑器在日间或夜间模式下的主题。\\n\\n在编辑器中,你可以导入和导出各种类型的图表文件。图标实际上将以 SVG+嵌入式 XML 的形式保存在 \u003C$text text=\\\"TiddlyWiki\\\" /> 中,这样可以保证图表的可编辑性。你可以在编辑器中导出为各种格式的文件,也可以在 \u003C$text text=\\\"TiddlyWiki\\\" /> 中导出为 SVG、PNG 等文件。\\n\\n> 如果你觉得编辑器太小,在编辑器的右下角有一个 {{$:/core/images/full-screen-button}} 全屏按钮,点击即可全屏编辑器,再次按 \u003Ckbd>Esc\u003C/kbd> 即可退出全屏!\\n\\n你可以在这里查看 draw.io 的官方文档:https://www.drawio.com/\\n\\n快来试试吧!\\n\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[\u003Clang>!search[zh]]\\\">\\n\\ndraw.io is a powerful online diagram editor that can be used to draw flowcharts, organizational charts, UML diagrams, network diagrams, floor plans, circuit diagrams, database diagrams, house floor plans, maps, etc.\\n\\nNow I have integrated it into \u003C$text text=\\\"TiddlyWiki\\\" />, you can use it here. Click the {{$:/plugins/Gk0Wk/drawio/new-drawio-diagram-icon}} button to create a new diagram tiddler, which will display its drawing content in non-editing mode, and will enter the draw.io editing interface in editing mode.\\n\\nNote: The editing mode requires networking, because draw.io is an online editor, which takes some time to load for the first time, so please be patient. But the preview image does not require networking, so you can view the chart in offline mode, and it is no different from your other images.\\n\\nYou can modify the theme of the editor in the settings of the plugin in day or night mode.\\n\\nIn the editor, you can import and export various types of chart files. The icon is actually saved in the form of SVG+embedded XML in \u003C$text text=\\\"TiddlyWiki\\\" />, which ensures the editability of the chart. You can export to various formats of files in the editor, or export to SVG, PNG and other files in \u003C$text text=\\\"TiddlyWiki\\\" />.\\n\\n> If you think the editor is too small, there is a {{$:/core/images/full-screen-button}} full screen button in the lower right corner of the editor, click to enter full screen editor, press \u003Ckbd>Esc\u003C/kbd> again to exit full screen!\\n\\nYou can view the official documentation of draw.io here: https://www.drawio.com/\\n\\nCome and try it!\\n\\n\u003C/$list>\\n\u003C/$list>\\n\"},\"$:/plugins/Gk0Wk/drawio/edit-drawio.js\":{\"title\":\"$:/plugins/Gk0Wk/drawio/edit-drawio.js\",\"module-type\":\"widget\",\"type\":\"application/javascript\",\"Modern.TiddlyDev#Origin\":\"edit-drawio.ts\",\"text\":\"\\\"use strict\\\";var drawioUnmountCheckTimer,editTextWidgetFactory=require(\\\"$:/core/modules/editor/factory.js\\\")[\\\"editTextWidgetFactory\\\"],SimpleEngine=require(\\\"$:/core/modules/editor/engines/simple.js\\\")[\\\"SimpleEngine\\\"],decode=require(\\\"$:/plugins/Gk0Wk/drawio/base64.min.js\\\")[\\\"decode\\\"],checkIfDarkMode=($tw.utils.registerFileType(\\\"application/x-drawio\\\",\\\"utf8\\\",\\\".drawio\\\",{flags:[\\\"image\\\"]}),$tw.utils.registerFileType(\\\"application/vnd.drawio\\\",\\\"utf8\\\",\\\".drawio\\\",{flags:[\\\"image\\\"]}),()=>{var e;return\\\"dark\\\"===(null==(e=null==(e=$tw.wiki.getTiddler($tw.wiki.getTiddlerText(\\\"$:/palette\\\")))?void 0:e.fields)?void 0:e[\\\"color-scheme\\\"])}),isChinese=()=>$tw.wiki.getTiddler(\\\"$:/language\\\").fields.text.includes(\\\"zh\\\"),drawioEditorInstance=new Set,registerInstance=e=>{$tw.browser&&void 0===drawioUnmountCheckTimer&&(drawioEditorInstance.add(e),drawioUnmountCheckTimer=setInterval(()=>{var e=[];for(const t of drawioEditorInstance)void 0!==t.iframeNode&&document.contains(t.iframeNode)||e.push(t);for(const i of e)drawioEditorInstance[\\\"delete\\\"](i);drawioEditorInstance.size\u003C1&&(drawioUnmountCheckTimer=void 0,clearInterval(drawioUnmountCheckTimer))},1e3))},DrawIOEditor=class{constructor({widget:d,value:e,parentNode:t,nextSibling:i}){if(this.parentNode=t,this.nextSibling=i,$tw.browser){this.iframeNode=$tw.utils.domMaker(\\\"iframe\\\",{document:d.document,\\\"class\\\":\\\"gk0wk-drawio-iframe\\\",attributes:{frameborder:\\\"0\\\"},style:{margin:\\\"0\\\",border:\\\"none\\\",width:\\\"100%\\\",minHeight:\\\"700px\\\",maxHeight:\\\"90vh\\\",height:\\\"100%\\\"}}),t.insertBefore(this.iframeNode,i);var r=$tw.utils.domMaker(\\\"button\\\",{\\\"class\\\":\\\"full-screen-button\\\",innerHTML:$tw.wiki.renderTiddler(\\\"text/html\\\",\\\"$:/core/images/full-screen-button\\\"),attributes:{title:isChinese()?\\\"全屏模式\\\":\\\"Full screen mode\\\"},style:{position:\\\"absolute\\\",right:\\\"0\\\",bottom:\\\"-42px\\\",padding:\\\"0 15px\\\",background:\\\"#fff3\\\",border:\\\"1px #fff7 solid\\\",cursor:\\\"pointer\\\"}});r.onclick=()=>this.setFullscreen(!0),t.insertBefore(r,i),this.xml=e;let a=!1;const n=({data:e,source:t})=>{var i;if(null!==(null==(i=this.iframeNode)?void 0:i.contentWindow)&&t===this.iframeNode.contentWindow){const{event:o,...s}=JSON.parse(e);switch(o){case\\\"init\\\":if(a)return;a=!0,this.iframeNode.contentWindow.postMessage(JSON.stringify({action:\\\"load\\\",xml:this.xml,autosave:1}),\\\"*\\\");break;case\\\"configure\\\":this.iframeNode.contentWindow.postMessage(JSON.stringify({action:\\\"configure\\\",config:{compressXml:!0,enableCssDarkMode:!1}}),\\\"*\\\");break;case\\\"load\\\":case\\\"save\\\":case\\\"autosave\\\":this.iframeNode.contentWindow.postMessage(JSON.stringify({action:\\\"export\\\",format:\\\"xmlsvg\\\",embedImages:!0,keepTheme:!0,twEditor:!0}),\\\"*\\\");break;case\\\"openLink\\\":var{href:r,target:n}=s;window.open(r,n);break;case\\\"export\\\":var{message:r,data:n}=s;if(n&&r.twEditor){r=decode(n.split(\\\",\\\",2)[1]);if(r===this.xml)return;this.xml=r,d.saveChanges(r)}}}};r=$tw.wiki.getTiddlerText(checkIfDarkMode()?\\\"$:/plugins/Gk0Wk/drawio/config/theme-dark\\\":\\\"$:/plugins/Gk0Wk/drawio/config/theme-light\\\",\\\"\\\")||\\\"Kennedy\\\";window.addEventListener(\\\"message\\\",n),this.iframeNode.setAttribute(\\\"src\\\",`https://embed.diagrams.net/?embed=1&ui=${r}&spin=1&libraries=1&noExitBtn=1&saveAndExit=0&noSaveBtn=1&proto=json&protocol=json&configure=1`),this.unmount=()=>{window.removeEventListener(\\\"message\\\",n)},registerInstance(this)}else t.insertBefore($tw.utils.domMaker(\\\"div\\\",{document:d.document,\\\"class\\\":\\\"gk0wk-drawio-preview\\\",style:{margin:\\\"0\\\",border:\\\"none\\\",width:\\\"100%\\\",height:\\\"100%\\\"},innerHTML:e}),i),this.xml=\\\"\\\",this.unmount=()=>null}loadXml(e){var t,i;e!==this.xml&&null!=(i=null==(t=null==(t=this.iframeNode)?void 0:t.contentWindow)?void 0:t.postMessage)&&i.call(t,JSON.stringify({action:\\\"load\\\",xml:e,autosave:1}),\\\"*\\\")}resize(){}fixHeight(){this.resize()}focus(){var e,t;null!=(t=null==(e=this.iframeNode)?void 0:e.focus)&&t.call(e)}createTextOperation(){return{text:\\\"\\\",selection:\\\"\\\",selStart:0,selEnd:0,cutStart:null,cutEnd:null,replacement:null,newSelStart:null,newSelEnd:null}}executeTextOperation(){return this.xml}updateDomNodeText(e){this.loadXml(e)}setText(e,t){this.loadXml(e)}setFullscreen(e=!0){var t,i;e?null!=(i=null==(t=this.iframeNode)?void 0:t.requestFullscreen)&&i.call(t):document.exitFullscreen()}},engine=$tw.browser?DrawIOEditor:SimpleEngine;exports[\\\"edit-drawio\\\"]=editTextWidgetFactory(engine,engine);\"}}}","title":"$:/plugins/Gk0Wk/drawio","type":"application/json","version":"0.0.4","Modern.TiddlyDev#SHA256-Hashed":"b0d2382b206bf4bdc7bf211a8e83b2df8b78b4d41bd41fb65e098836147a2576"}, {"title":"$:/plugins/ipfs","type":"application/json","text":"{\n \"tiddlers\": {\n \"$:/ipfs/image/bluelight\": {\n \"title\": \"$:/ipfs/image/bluelight\",\n \"_canonical_uri\": \"/ipfs/bafybeibi5ldguonidlwomjxwjehodpmypgex5qd2fe6f6yuka4dqvbzvpq\",\n \"_import_uri\": \"/ipfs/bafybeiejplubmcgpkaqwjc23ebo6vorv2p4cwlr7kkhm4cakgtneefjuc4\",\n \"modified\": \"20200526065100279\",\n \"tags\": \"$:/ipfs/documentation $:/isAttachment $:/isIpfs\",\n \"type\": \"image/jpg\",\n \"text\": \"\"\n },\n \"$:/core/images/ens\": {\n \"title\": \"$:/core/images/ens\",\n \"modified\": \"20200528044634920\",\n \"source\": \"https://github.com/ensdomains/ens-app/blob/dev/public/safari-pinned-tab.svg\",\n \"license\": \"https://github.com/ensdomains/ens-app/blob/dev/LICENSE\",\n \"tags\": \"$:/tags/Image $:/ipfs/core $:/isAttachment $:/isEmbedded\",\n \"type\": \"image/svg+xml\",\n \"text\": \"\u003C?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\"?>\\n\u003Csvg\\n xmlns:dc=\\\"http://purl.org/dc/elements/1.1/\\\"\\n xmlns:cc=\\\"http://creativecommons.org/ns#\\\"\\n xmlns:rdf=\\\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\\\"\\n xmlns:svg=\\\"http://www.w3.org/2000/svg\\\"\\n xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n xmlns:sodipodi=\\\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\\\"\\n xmlns:inkscape=\\\"http://www.inkscape.org/namespaces/inkscape\\\"\\n version=\\\"1.0\\\"\\n width=\\\"18\\\"\\n height=\\\"18\\\"\\n viewBox=\\\"0 0 128 128\\\"\\n class=\\\"tc-image-button\\\"\\n preserveAspectRatio=\\\"xMidYMid meet\\\"\\n id=\\\"svg14\\\"\\n sodipodi:docname=\\\"ens-small.svg\\\"\\n inkscape:version=\\\"0.92.4 (5da689c313, 2019-01-14)\\\"\\n>\\n \u003Cdefs\\n id=\\\"defs18\\\" />\\n \u003Csodipodi:namedview\\n pagecolor=\\\"#ffffff\\\"\\n bordercolor=\\\"#666666\\\"\\n borderopacity=\\\"1\\\"\\n objecttolerance=\\\"10\\\"\\n gridtolerance=\\\"10\\\"\\n guidetolerance=\\\"10\\\"\\n inkscape:pageopacity=\\\"0\\\"\\n inkscape:pageshadow=\\\"2\\\"\\n inkscape:window-width=\\\"1920\\\"\\n inkscape:window-height=\\\"1020\\\"\\n id=\\\"namedview16\\\"\\n showgrid=\\\"false\\\"\\n inkscape:zoom=\\\"12.361274\\\"\\n inkscape:cx=\\\"41.295086\\\"\\n inkscape:cy=\\\"21.734019\\\"\\n inkscape:window-x=\\\"0\\\"\\n inkscape:window-y=\\\"31\\\"\\n inkscape:window-maximized=\\\"1\\\"\\n inkscape:current-layer=\\\"svg14\\\" />\\n \u003Cmetadata\\n id=\\\"metadata2\\\">\\nCreated by potrace 1.11, written by Peter Selinger 2001-2013\\n\u003Crdf:RDF>\\n \u003Ccc:Work\\n rdf:about=\\\"\\\">\\n \u003Cdc:format>image/svg+xml\u003C/dc:format>\\n \u003Cdc:type\\n rdf:resource=\\\"http://purl.org/dc/dcmitype/StillImage\\\" />\\n \u003Cdc:title>\u003C/dc:title>\\n \u003C/cc:Work>\\n\u003C/rdf:RDF>\\n\u003C/metadata>\\n \u003Cg\\n transform=\\\"matrix(0.08837363,0,0,-0.07925696,-8.0787259,127.6037)\\\"\\n id=\\\"g12\\\"\\n style=\\\"fill:#000000;stroke:none\\\">\\n \u003Cpath\\n d=\\\"m 640,1519 c -69,-48 -173,-122 -231,-163 -94,-65 -110,-82 -134,-129 -30,-63 -37,-155 -15,-222 15,-49 61,-135 71,-135 6,0 437,704 447,731 7,19 -17,4 -138,-82 z\\\"\\n id=\\\"path4\\\"\\n inkscape:connector-curvature=\\\"0\\\" />\\n \u003Cpath\\n d=\\\"m 856,1598 c 4,-7 44,-67 89,-133 118,-175 286,-437 393,-615 93,-154 122,-224 125,-300 2,-55 17,-35 52,75 26,80 28,92 22,217 -7,185 -45,284 -149,387 -35,36 -520,381 -534,381 -3,0 -2,-6 2,-12 z\\\"\\n id=\\\"path6\\\"\\n inkscape:connector-curvature=\\\"0\\\" />\\n \u003Cpath\\n d=\\\"M 141,1068 C 97,969 87,913 93,776 98,649 106,607 146,523 163,485 224,403 254,378 291,346 772,9 776,12 c 2,2 -57,95 -131,206 -132,199 -320,496 -404,639 -48,81 -70,145 -73,210 -1,23 -3,43 -4,43 -2,0 -12,-19 -23,-42 z\\\"\\n id=\\\"path8\\\"\\n inkscape:connector-curvature=\\\"0\\\" />\\n \u003Cpath\\n d=\\\"M 1079,398 C 962,204 859,34 851,20 l -16,-25 30,21 c 306,211 436,304 461,331 51,53 72,165 49,254 -14,51 -63,149 -76,149 -4,0 -103,-159 -220,-352 z\\\"\\n id=\\\"path10\\\"\\n inkscape:connector-curvature=\\\"0\\\" />\\n \u003C/g>\\n\u003C/svg>\"\n },\n \"$:/ipfs/logo/vector/ice/text\": {\n \"title\": \"$:/ipfs/logo/vector/ice/text\",\n \"modified\": \"20200528040053586\",\n \"source\": \"https://github.com/ipfs/logo/blob/master/vector/ipfs-logo-vector-ice-text.svg\",\n \"license\": \"https://github.com/ipfs/logo/blob/master/LICENSE\",\n \"tags\": \"$:/isAttachment $:/isEmbedded\",\n \"type\": \"image/svg+xml\",\n \"text\": \"\u003C?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\"?>\\n\u003Csvg\\n xmlns:rdf=\\\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\\\"\\n style=\\\"enable-background:new\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n height=\\\"512\\\"\\n width=\\\"512\\\"\\n version=\\\"1.1\\\"\\n xmlns:cc=\\\"http://creativecommons.org/ns#\\\"\\n xmlns:dc=\\\"http://purl.org/dc/elements/1.1/\\\"\\n viewBox=\\\"0 0 512 512\\\"\\n>\\n \u003Cdefs>\\n \u003ClinearGradient id=\\\"c\\\" y2=\\\"771.51\\\" gradientUnits=\\\"userSpaceOnUse\\\" y1=\\\"771.51\\\" x2=\\\"527.72\\\" x1=\\\"84.315\\\">\\n \u003Cstop stop-color=\\\"#4a9ea1\\\" offset=\\\"0\\\"/>\\n \u003C/linearGradient>\\n \u003ClinearGradient id=\\\"d\\\" y2=\\\"771.48\\\" gradientUnits=\\\"userSpaceOnUse\\\" y1=\\\"771.48\\\" x2=\\\"512.36\\\" x1=\\\"99.675\\\">\\n \u003Cstop stop-color=\\\"#63d3d7\\\" offset=\\\"0\\\"/>\\n \u003C/linearGradient>\\n \u003C/defs>\\n \u003Cg>\\n \u003Cg style=\\\"enable-background:new\\\" transform=\\\"translate(-50.017,-515.51)\\\">\\n \u003Cpath fill=\\\"url(#c)\\\" d=\\\"m84.315 899.51 221.7 128 221.7-128v-256l-221.7-127.99-221.7 128z\\\"/>\\n \u003Cpath fill=\\\"url(#d)\\\" d=\\\"m283.13 546.35-160.74 92.806c0.32126 2.8543 0.32125 5.7352 0 8.5894l160.75 92.806c13.554-10.001 32.043-10.001 45.597 0l160.75-92.807c-0.32126-2.8543-0.32293-5.7338-0.001-8.588l-160.74-92.806c-13.554 10.001-32.044 10.001-45.599 0zm221.79 127.03-160.92 93.84c1.884 16.739-7.3611 32.751-22.799 39.489l0.18062 184.58c2.6325 1.1489 5.1267 2.5886 7.438 4.294l160.75-92.805c-1.884-16.739 7.3611-32.752 22.799-39.49v-185.61c-2.6325-1.1489-5.1281-2.5886-7.4394-4.294zm-397.81 1.0315c-2.3112 1.7054-4.8054 3.1465-7.438 4.2954v185.61c15.438 6.7378 24.683 22.75 22.799 39.489l160.74 92.806c2.3112-1.7054 4.8069-3.1465 7.4394-4.2954v-185.61c-15.438-6.7378-24.683-22.75-22.799-39.489l-160.74-92.81z\\\"/>\\n \u003C/g>\\n \u003Cg style=\\\"enable-background:new\\\" transform=\\\"translate(0,-196.66)\\\">\\n \u003Cpath fill-opacity=\\\".25098\\\" d=\\\"m256 708.66 221.7-128v-256l-221.7 128v256z\\\"/>\\n \u003Cpath fill-opacity=\\\".039216\\\" d=\\\"m256 708.66v-256l-221.7-128v256l221.7 128z\\\"/>\\n \u003Cpath fill-opacity=\\\".13018\\\" d=\\\"m34.298 324.66 221.7 128 221.7-128-221.7-128-221.7 128z\\\"/>\\n \u003C/g>\\n \u003C/g>\\n \u003Cg style=\\\"enable-background:new\\\" fill=\\\"#fff\\\">\\n \u003Cpath d=\\\"m103.09 186h-29.2v141.2h29.2v-141.2z\\\"/>\\n \u003Cpath d=\\\"m153.97 327.2v-51.8c7.2 0.6 14.4 0.6 20.4 0.6 41.6 0 53.6-20.6 53.6-46 0-30.8-22-44-56-44h-47.2v141.2h29.2zm15.8-71.8c-5.4 0-13.4 0-15.8-0.2v-48h18.2c17.6 0 27.6 8.4 27.6 23.8v0.4c0 12-4.4 24-30 24z\\\"/>\\n \u003Cpath d=\\\"m327.95 186h-88.6v141.2h29.2v-62.2h55.4v-21.2h-55.6v-36.4h57.6l2-21.4z\\\"/>\\n \u003Cpath d=\\\"m423.51 213.6 7.6-19.6c-11.4-8.2-26.8-11.2-46.2-11.2-28.2 0-51.4 13.2-51.4 40.2 0 24.2 17.8 33.8 35.6 39.6l17.8 6c12.2 4.2 22.2 8.2 22.2 21.4 0 12-10.4 16.8-26.2 16.8-16 0-33.2-4.8-43-11l-7.6 21.2c12.8 8.2 29 12.2 50.8 12.2 31 0 55-13.6 55-42.6 0-27-20.6-35.6-41.4-42.6l-19.4-6.4c-8.4-2.8-14.8-6.6-14.8-17.4 0-11 9-15.4 22.4-15.4 16.4 0 29.2 3 38.6 8.8z\\\"/>\\n \u003C/g>\\n\u003C/svg>\"\n },\n \"$:/core/images/ipfs\": {\n \"title\": \"$:/core/images/ipfs\",\n \"modified\": \"20200528044634920\",\n \"source\": \"https://github.com/ipfs/logo/blob/master/vector/ipfs-logo-vector-black.svg\",\n \"license\": \"https://github.com/ipfs/logo/blob/master/LICENSE\",\n \"tags\": \"$:/tags/Image $:/ipfs/core $:/isAttachment $:/isEmbedded\",\n \"type\": \"image/svg+xml\",\n \"text\": \"\u003C?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\"?>\\n\u003Csvg\\n xmlns:dc=\\\"http://purl.org/dc/elements/1.1/\\\"\\n xmlns:cc=\\\"http://creativecommons.org/ns#\\\"\\n xmlns:rdf=\\\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\\\"\\n xmlns:svg=\\\"http://www.w3.org/2000/svg\\\"\\n xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n xmlns:sodipodi=\\\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\\\"\\n xmlns:inkscape=\\\"http://www.inkscape.org/namespaces/inkscape\\\"\\n style=\\\"enable-background:new\\\"\\n height=\\\"22\\\"\\n width=\\\"22\\\"\\n version=\\\"1.1\\\"\\n viewBox=\\\"0 0 128 128\\\"\\n class=\\\"tc-image-button\\\"\\n id=\\\"svg24\\\"\\n sodipodi:docname=\\\"ipfs-small.svg\\\"\\n inkscape:version=\\\"0.92.4 (5da689c313, 2019-01-14)\\\"\\n>\\n \u003Cmetadata\\n id=\\\"metadata28\\\">\\n \u003Crdf:RDF>\\n \u003Ccc:Work\\n rdf:about=\\\"\\\">\\n \u003Cdc:format>image/svg+xml\u003C/dc:format>\\n \u003Cdc:type\\n rdf:resource=\\\"http://purl.org/dc/dcmitype/StillImage\\\" />\\n \u003Cdc:title>\u003C/dc:title>\\n \u003C/cc:Work>\\n \u003C/rdf:RDF>\\n \u003C/metadata>\\n \u003Csodipodi:namedview\\n pagecolor=\\\"#ffffff\\\"\\n bordercolor=\\\"#666666\\\"\\n borderopacity=\\\"1\\\"\\n objecttolerance=\\\"10\\\"\\n gridtolerance=\\\"10\\\"\\n guidetolerance=\\\"10\\\"\\n inkscape:pageopacity=\\\"0\\\"\\n inkscape:pageshadow=\\\"2\\\"\\n inkscape:window-width=\\\"1920\\\"\\n inkscape:window-height=\\\"1020\\\"\\n id=\\\"namedview26\\\"\\n showgrid=\\\"false\\\"\\n units=\\\"pt\\\"\\n inkscape:zoom=\\\"5.2149125\\\"\\n inkscape:cx=\\\"133.61143\\\"\\n inkscape:cy=\\\"41.576599\\\"\\n inkscape:window-x=\\\"0\\\"\\n inkscape:window-y=\\\"31\\\"\\n inkscape:window-maximized=\\\"1\\\"\\n inkscape:current-layer=\\\"svg24\\\" />\\n \u003Cdefs\\n id=\\\"defs8\\\">\\n \u003ClinearGradient\\n id=\\\"b\\\"\\n y2=\\\"771.51001\\\"\\n gradientUnits=\\\"userSpaceOnUse\\\"\\n x2=\\\"527.71997\\\"\\n y1=\\\"771.51001\\\"\\n x1=\\\"84.315002\\\">\\n \u003Cstop\\n offset=\\\"0\\\"\\n id=\\\"stop2\\\" />\\n \u003C/linearGradient>\\n \u003ClinearGradient\\n id=\\\"a\\\"\\n y2=\\\"771.47998\\\"\\n gradientUnits=\\\"userSpaceOnUse\\\"\\n x2=\\\"512.35999\\\"\\n y1=\\\"771.47998\\\"\\n x1=\\\"99.675003\\\">\\n \u003Cstop\\n stop-color=\\\"#d8d8d8\\\"\\n offset=\\\"0\\\"\\n id=\\\"stop5\\\" />\\n \u003C/linearGradient>\\n \u003C/defs>\\n \u003Cg\\n transform=\\\"matrix(0.28867709,0,0,0.24999998,-24.339808,-128.87748)\\\"\\n id=\\\"g14\\\">\\n \u003Cpath\\n d=\\\"m 84.315,899.51 221.7,128 221.7,-128 v -256 l -221.7,-127.99 -221.7,128 z\\\"\\n id=\\\"path10\\\"\\n style=\\\"fill:url(#b)\\\"\\n inkscape:connector-curvature=\\\"0\\\" />\\n \u003Cpath\\n d=\\\"m 283.13,546.35 -160.74,92.806 c 0.32126,2.8543 0.32125,5.7352 0,8.5894 l 160.75,92.806 c 13.554,-10.001 32.043,-10.001 45.597,0 l 160.75,-92.807 c -0.32126,-2.8543 -0.32293,-5.7338 -0.001,-8.588 l -160.74,-92.806 c -13.554,10.001 -32.044,10.001 -45.599,0 z M 504.92,673.38 344,767.22 c 1.884,16.739 -7.3611,32.751 -22.799,39.489 l 0.18062,184.58 c 2.6325,1.1489 5.1267,2.5886 7.438,4.294 l 160.75,-92.805 c -1.884,-16.739 7.3611,-32.752 22.799,-39.49 v -185.61 c -2.6325,-1.1489 -5.1281,-2.5886 -7.4394,-4.294 z m -397.81,1.0315 c -2.3112,1.7054 -4.8054,3.1465 -7.438,4.2954 v 185.61 c 15.438,6.7378 24.683,22.75 22.799,39.489 l 160.74,92.806 c 2.3112,-1.7054 4.8069,-3.1465 7.4394,-4.2954 v -185.61 c -15.438,-6.7378 -24.683,-22.75 -22.799,-39.489 l -160.74,-92.81 z\\\"\\n id=\\\"path12\\\"\\n style=\\\"fill:url(#a)\\\"\\n inkscape:connector-curvature=\\\"0\\\" />\\n \u003C/g>\\n \u003Cg\\n transform=\\\"matrix(0.28867709,0,0,0.24999998,-9.9010468,-49.164992)\\\"\\n id=\\\"g22\\\">\\n \u003Cpath\\n d=\\\"m 256,708.66 221.7,-128 v -256 l -221.7,128 z\\\"\\n id=\\\"path16\\\"\\n inkscape:connector-curvature=\\\"0\\\"\\n style=\\\"fill-opacity:0.25097997\\\" />\\n \u003Cpath\\n d=\\\"m 256,708.66 v -256 l -221.7,-128 v 256 z\\\"\\n id=\\\"path18\\\"\\n inkscape:connector-curvature=\\\"0\\\"\\n style=\\\"fill-opacity:0.03921599\\\" />\\n \u003Cpath\\n d=\\\"m 34.298,324.66 221.7,128 221.7,-128 -221.7,-128 z\\\"\\n id=\\\"path20\\\"\\n inkscape:connector-curvature=\\\"0\\\"\\n style=\\\"fill-opacity:0.13018003\\\" />\\n \u003C/g>\\n\u003C/svg>\"\n },\n \"$:/core/images/bluelight\": {\n \"title\": \"$:/core/images/bluelight\",\n \"modified\": \"20200528045157536\",\n \"tags\": \"$:/tags/Image $:/ipfs/core $:/isAttachment $:/isEmbedded\",\n \"type\": \"image/png\",\n \"text\": \"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Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICB4bWxuczpwbHVzPSJodHRwOi8vbnMudXNlcGx1cy5vcmcvbGRmL3htcC8xLjAvIgogICAgeG1sbnM6R0lNUD0iaHR0cDovL3d3dy5naW1wLm9yZy94bXAvIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkUyRjFBQzkzNzUzNTExRTQ4QTkwRTdFRDUwRTU1MTZBIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmMzMGY2MGJkLTBlYTAtNDU4YS1iZjVkLTUzYzIzNTFhY2UwMCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjllMzlkYmZlLTA5ZGEtNDYyNi04ZmUzLTRjZGVkNzIzY2M3OSIKICAgR0lNUDpBUEk9IjIuMCIKICAgR0lNUDpQbGF0Zm9ybT0iTGludXgiCiAgIEdJTVA6VGltZVN0YW1wPSIxNTg4NDg0NDExOTg4ODc5IgogICBHSU1QOlZlcnNpb249IjIuMTAuOCIKICAgZGM6Rm9ybWF0PSJpbWFnZS9wbmciCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIj4KICAgPGlwdGNFeHQ6TG9jYXRpb25DcmVhdGVkPgogICAgPHJkZjpCYWcvPgogICA8L2lwdGNFeHQ6TG9jYXRpb25DcmVhdGVkPgogICA8aXB0Y0V4dDpMb2NhdGlvblNob3duPgogICAgPHJkZjpCYWcvPgogICA8L2lwdGNFeHQ6TG9jYXRpb25TaG93bj4KICAgPGlwdGNFeHQ6QXJ0d29ya09yT2JqZWN0PgogICAgPHJkZjpCYWcvPgogICA8L2lwdGNFeHQ6QXJ0d29ya09yT2JqZWN0PgogICA8aXB0Y0V4dDpSZWdpc3RyeUlkPgogICAgPHJkZjpCYWcvPgogICA8L2lwdGNFeHQ6UmVnaXN0cnlJZD4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6Y2U5MDE2NGYtZGMzYS00ZDg2LWFiNDMtMzQ2ODk4NDExMmI1IgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKExpbnV4KSIKICAgICAgc3RFdnQ6d2hlbj0iKzA1OjMwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICAgPHhtcE1NOkRlcml2ZWRGcm9tCiAgICBzdFJlZjpkb2N1bWVudElEPSI2OUJCODkzQzc1RTJBODMyMDU4MTA4OTg4OEU1MTAxRSIKICAgIHN0UmVmOmluc3RhbmNlSUQ9IjY5QkI4OTNDNzVFMkE4MzIwNTgxMDg5ODg4RTUxMDFFIi8+CiAgIDxwbHVzOkltYWdlU3VwcGxpZXI+CiAgICA8cmRmOlNlcS8+CiAgIDwvcGx1czpJbWFnZVN1cHBsaWVyPgogICA8cGx1czpJbWFnZUNyZWF0b3I+CiAgICA8cmRmOlNlcS8+CiAgIDwvcGx1czpJbWFnZUNyZWF0b3I+CiAgIDxwbHVzOkNvcHlyaWdodE93bmVyPgogICAgPHJkZjpTZXEvPgogICA8L3BsdXM6Q29weXJpZ2h0T3duZXI+CiAgIDxwbHVzOkxpY2Vuc29yPgogICAgPHJkZjpTZXEvPgogICA8L3BsdXM6TGljZW5zb3I+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz7mbkekAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5AUDBSgLVxBmYwAAIABJREFUeNrsvfmXXVeVJvjtvc+5970Xg0KDNdmSLNlYHsADYGNjwGbIJDspksoRqM7KzKrsytU51Frd/wH9Q/8BPayqytXV3ZVZQEKSCSRgwE4bG8/gUXi2ZcmapYiQFPN7956z9+4f7gvZSVnKlpElh7nf0g/SWlovXtx7vrPnb5O7o0WLFhca3D6CFi1aKrZo0aKlYosWLRVbtGjRUrFFi5aKLVq0aKnYokVLxRYtWrRUbNGipWKLFi1aKrZo0VKxRYsWLRVbtGip2KJFi5aKLVqsZIT2EbzdqE0LlpyqEBhEDtRmgYIpxwC4gjJgCs4o1KlcmlcKRoWLiCAwiGq3mtgIo2bsVLs7U2mGIHau7lMzMJvD1DxwNAUIzAavc7YQCzM4MYizmgh7jRiRsjJDhMzM3UUigGqgRUcAqCVhd2OmAGrPwplA7ejw2w2DMsgVJMg5kwQAQuzu6qbuJKF2nJjH5HGdnFw4WC1Wg6SqnTKuWzWyaU1n00W9taMYgwLsmkUIYDg7IeWqCOU5+6pm5nWQAmBVJXJm5IwQQlYszOf+gI4dXTx86GSVXEBj43Hzxas2bOp1OwjRmVhzZnKWaAYnA8wtBylythDae7+l4gVGNgNxAJA1BxaACIDNQzq1xWNzg1f2HXlp39Hjs4M6yyJ1GBKYxJXT/EhM2zZObN289qrLLh/pQVBZrZG6zgSBweTcRRnubpZFZEhMNyZOkMEg73r6pQcefPJnu/bse+3oUj8Ll8mSUF570eill66//vorPvqR9++8YnsZCJaJyAmmEJE2CGqp+A6iYs5ACAQQlGCmYI6J6qW6eG7P0q6Xpw6f7C8lM6EYo3Cq66QGEYnspv2AHAQf3fmeq3aOb1rFSBq4BJBQkxTnytaYGRERyCyxwOEOMcje/faNr3/3h99/ZPpYnTWKiAQbpEUuSrgwolWpiLpl66pf/fSHfue3fnXLFgAGqLkzBYDVwNz6py0V3wEuqho7A/CAbJ7NmbgcQJ98dt8Tzxw7NgsLXSrYvHbkaAQWp+AIaq5wZhKRsVRdf/XELTdcsiZGMoBQpwEVMULOkUlUd2FCQ8UqpRB7L7xw+H//y79/9OGfLcxRr1xfV6RQ4uzIJgJlzxJEOgXVaXrVKr/hhp1//Ae/fuNNVzCbQwmxriyWnHIqQmyPQpu2uZBwM2Y2NBkaIyJQuWS4bxc9+bOlmYVOObE6e846YO7ATCIRkRmSmjsxC0A5+3ym5/dNbdowNrZtHWcPATFGO3fGxglMgA3/WcTeocPpr/76zkcePLKwMFIWnSqn7LnT6ZiJGeVcxRglkllODubu7Fx+6MF9df8Op5EbP3SxAGYmwgTE0BrFfwatH3/+HjSDACeEBLz42snndz9T5fnuqFqe1v5kh1KPJSQa1LnOZkBgKhgFI3oOlnIZTi767v0zSwoKBCKACXru0kvmgDmYGaA64x/veeIf73x6aT4IjbgLSCVYnRZTtcDQXhk8V6lehOeUUpXM0atS99GfHvjq1+589dVpB5uZCOq6JrTOV0vFCx4DMMzNDESETGphdhE/e/7giQVXHjWMuY8U3TWg2K+WQpc4CBG5u5mpW1ZTsJEkcufukcn5E3OVM0Bw93MYghEoJQUAIjWdml645+4H+/2IMC3FovmiWSaSQspOZ8QdeSCRRgNGmLpBSg5MoTKec0zcdfdP7v3xwympSHBDEQs/d1dGS8UWbzlSDEJgTnB2isp4af/0gamBMRu7ogIl19rMRGLOJg5yJ3eiJo3iDgN5t6pS8Mkl1moxWIYjgy2Hc0dFL6LA1b1iLvfuPrl37zHjRcaY5RIemSKcslmy7AyIKZKzmtXuymDPIuhWeZG584PvvnDo8IxpU0mFqbQnoaXiBbeKDoAgZomEFyvsO3BUz96aOUUiocbCqmfNzGA5x4eBmeFshmNTUzNz88Sdoff6c2Hl6RFjTOZ79xx8+qnniKCeQdaetJaK7wAqUm6MnJMpMLugR6f7ic46nagIKWlgEYk+pKCD7JxZbzN3gN0JzjC4GoO7P8/Df46NSWtCTCnu23+MBObZocu1yhYtFS8kEhG5EzMbfGGQXUrjs37yErtU12vGur1ej4QlhKaX5Vx9S2FxNwBE7I7R0REKlM/+40NguBCK2ZmlaoAQBIC1WZuWiu8EuwjgVP3Wl3HWR5ytpGrrReNjvdCcbAaIz+EbZNWUUyIIOzZunti8aTUhg3z45/Uzw2c4Oe5OjJRSt9txd2pr+y0V3zEI7s4MM2NQr2BPfbazdizT0szaEWzfNN4Taojs7uf2DTJzEysy+WWXrv/ADZd7nn1zB/X0PzelBJiEfMmW9Z0uNTcRt3xsqfgOQASMyMlZgPGRsH5NGaw+20/pxnrn1rXb1nUEFZMDIAf8nL1BA1iEOXoy0zQ+wp/42A3bLhl7k7TNGY9NGTtq1bZtG3bs2AzDsHPd22JGS8ULDTcQkUOZo6bc69C2LRvl7Evem9avuvLyi1ePwXK/4QYz49z1LappygkAMQuBkG677bpf//TtZ/056kL24Vs/cO21O0FwM7TNlS0V3xFUZHVwzhGAiJRMV2zZuHWddKzmXDuxSW/gZaIoHMiNjJgkmykRh6ipDl5dfNHIr7xv4+bxUSUgrCJyQjYzP3eOX8FUhAiCizsXQGSkf/cnH/vC734uEsTQiR2tVURU1ZzYgyoxFwYyEDPnnIko0ODDN1/1G//yfd0Ocl0TBfcAtBnUfwbypS99qX0Kb3vSpomXGDkPWELsUizLqZNLOQ9cjYTJzTWTKwOeKxERKYGAVI9isPPizs1Xb9q6YXVZMhHcMhM11yjROZyQMiJqJgSIQEQiIiKXXT0RwtLhw/tPnpwlYiJIJCKFOQm5W051CCSsqkudkm68cfsf/tFvfPDGLYzMTAQmgXs+h1/13XlO2smMt90quroLMQhQG4DJUfbVH9/tu/fuf+3odOVAiGAnN5gGGYHTYDDgbJvWjl67Y901O8Y3rI4EDPtWCET0Njg1w0L88pEY/hAF5uZwz10/+/4djz7z3N6Ts4sxxqquO91Q15kphFDANddLmzZedMstH/rCf3/91e/dHCjBM1OpSiJkSIx2MqOl4oWlIpIpswgAQjZXgAhSkxw5Mbtn//F9R2emTyz1B+TG7p6DjxS8cVXn0o0Tl226aMNFI2XhZgNw1ywziLkhzDA5SW9PctJsWGNUnw/cdYTDR+affOrZhx7d9cJze06cXJib4xAC4Ez1lksuev8Hdt764Ws/8IFrxkYYyO6JnOERzCDLVkXutoehpeKFRTIjInEQEQjQlCWEvi5y6Bno5BKOn0zzSyknyo7eWDFS2JpxmehyQU4gBZL5KOspS2iqIOFzWVR8vfLZWMPmn0QER6rrUIjBs3HOPHUsHT8xmD4+k1Iqy2LN6rF1a0cmJkK3oyGoJZJAxOwKEBNBTVmMWqvYUvHCwpAYNOwoW/b5iAA3mIHcScBkRA53INROBYCUUWn2IpQEgaqLEARAM+RBRA44zuVwxuv0+6dmHYA5iJTIDDBjgihXKecgnUDigAAEc8tEBYCsBiAIA3A4kbc5wpaKFxiVa0FEMIAdUBADpO7UeICNwYQ7koEIBcEsqTghGNiyCzwKqyURadpZmeGAuRkQz3U65A2ENABmzARVEBuzqldEzmBgxN0xNKGAGzPgqholNBQ2t6biglTXsSzaw9BS8UKidkQC5coZzqwAgwjeOGwEM9Xm0BMRMZsHJsDVsxIXIIBg6iRDe2UGZhg8mwnTuZKZUlVmPuWd0nKnm6PKhsAlgc2MG+YneKiIxVSJQyM7QM7U3BGWWMibxgBjTRZj0RrFlopDZHUWvO7OOeAAAZQBJM0i0d1dESSYKgUyN4KZmYgQJOccQmgdrfP0vppapLuZMTktOwLw4lSM3Fhld5hBYCSAu5oREXNopLJWSg3ll8oqVmpOxExBVYmImTVnQmQhM5CAHGrOcGK2N3RONjP1ImLnNDZrcSY/GWaqzIGIkmY3CkGc3tgrYKfyWAAMnnMtjZYOoKbCTKCVIuD0S0TFulosyu6y90WAOYxAruLETMgGkAZ29wqWQBPEsKxmkCCNT2lu0paqzxMSGj0D4kbLAEPmpWH2q2k1omFrfKZo5kQk5GaZueGoAWVLxXcYrHll5mROYAqqvtAfeNWdnJ41A9iLUtauGRnpcQiAwryWwHACCRxJjQUtFc+TVXQlkmX9fwGQqjrGCLJGYkvdgOZ1mJslpdBkbBuT2pzvlePD/BJRUXNfAqlnEAHdkzPpiSdfevaZ3bt2vXzo4JEq5RDCxMTojh2bP/Sh6z7+iY+sXwWn5KgZwUzchYXMs1CrWHlebs5mRpKaBJLllACEWCq4SlgapCplAGUM3TKWEYEMgNUJYI4RaFYMYKVw8ZeIim61IxDzUh+PPX7wO//wwCMPvXj8xIA4g5kg2Y3Fc700sar3oRtv+IN/fdONH7pcKNVpsYgjbsLMqqnZ0NLibb86AcuIAlBOdR2KjoKPzyw9NVlOHT9xdOrEUlUTUa8s1q+dWLdm9bXrF9evmYgwTVUQBosZmFfMvfnLZBVxktE7flK//4PH/uarP3x1zwmRsUGtRQgkkrMlzb1eD6ZVf2lstHfte9f+yZ/+3odv2crIBDZj1yzBQS0VzxMVBQCyaTaKNcuByfzsK/ue3zNdpZRdJBZEpKkW5Chyyfruzh1br9y+ZqwAbMBmIUTCilna8UtERXMszOHLX7n7v/zV92ZOInbGllJfhEiTwmOMalDVKJEBTZkw+Oznbvn3//63t2zpaV0XRWFZOXgrqX6+QntlmFkiiHK5+1j10K69ew6eMCoMQcFKTEQBzq6wGl52Y3rv5Rs+eM0lG1YhAgyDE9HK8FDfjRkIr81RmxpqM4O5o26SNl/52re/8rU7TswpyljpQnSPKYKjcGFK5BQ4uLu6I4iX3fsefOL+B/Y6EAoxrzmQezt3d56QIA5nMjBPDfDky0dfOTDrNJa5MGZiBDKBOkyJVMp+1Jrjky/svu/pFyfnITCrp94gydNS8fwzkZrKLzXtKyAjcFa+554X/+HbDx05ukjcqVOOMYYiUDztq0q1zc8tPfnErpMzSwQys5Ye59dhA0BASBb2H5w6eHRKzbOf9i0UUqYaivK1gyeffvbg8dksxcQ5FBxpqXj2rxAMQKgZgSVzd4TJqcXvf2/X/v1VkDUxjLqTui1VS3UenPbVxlF4fPnlPXOzS41AC94wvtDi7UYkkDMoVKA9h6en5hap7Eo8bXTA6m5EYezkAp57bfrFA7OK0lfO/flutIrwJjogEncHmQFPP7Xnvh8/mTWCY9Ikkc0sFDGWndOmDTKAMHNyfmmpr+ohBGuam1ucpysVqqoW5gc4fHwhIZLEbHr695U4kHOQzvhsRc/sPTw9v5LuzXfnwaLl1S6NYVzq4/4Hn+nngQdXWyJO5J6TwaWqzqRExsxmZmbuBPBKSQC8axI3zOyMhX5e7KdQdLOZ6enZRdk5JasdyIJ90/Mv7TtG0lLxQprFRvSl2XlmDp85ubjr6T1GplYRm5syUVkUQiHIaSd3JBCRdzpFWZYhwCwTkWorInje3mPTj4ics6qLRDc6g+C/hCJ7Zhi0BlGWcvfBqcXcpm0uaNrG3BhDBW4CHZs6OX28r1mEu0HKnNTU3VBVVTOW8eZpmzRIebBp88Zer1yOEq3d/XDekHMNV3Owu8AtZVI7Q0JUEd1JiDsU4M5x7NjJND3bb6l4AWOMYbbTtZEww+z8vGkQGrUcLXEZupGjqwaGnH79S4hcFGHnzstWrVoFgAU555Yh5w0iAqJA6BZlt4xkKiJnkFTNFkCRMkoJWuugQr/CzHy9Un7fd2W1mgMT3NzdIQoNLLAcKJmbImbPRMYRViMpi0FRhyDZHAgiBEuOym00ln7zLdtGu+xZWSJzNtTsr58HIgERjAAkT4GFyOHmDuLgYG0bAt56wC8wcWB8FKtHw8wiL2odevC6Y2aNpIhZBimxGpnDogfNWNJkRVQEtzgYDN6Y9H4nR/vv1gwqNddqU10cGekV0dVSUYZm22GIbJYdFgKbcyg6CjWqk/brXHEMABMWPvXJW659305mYCh+IQA5FeACXDgV2ThlJPLMYClAYhA1cTSfAGlrH78AF0Fw17LgDWtXu9Yxljmx2YKgYh9AB4GslBA8ck2kNawumBgWyUsh6IA8rwgevmsdVDTaSDzkwfp1E1u3rXWylBJTEI6DfjLlsuiklFzqpWouu4XYC3E0hhE4mdm2S3qf/vSHNmwIbhlo1OaJEE2TaYIrkwXxGBCJA8jVs0OdiGW44MlOs/qlxf8PGAhkxFoAl25Z3+sQNMNjGbwoLIgRarfaUyJFwWUBJhgLwZxNPS/BU6coMRQQeqdnv9+VVBwe/yZiZPC6daO3fvi9QbKEbF6nlMqyLMuyThVgUigHjwWlVBO5uy4szq5aNfL5z99+0wcvZ0CtZhEnqBoASCNvNvR73Mmya7IgGskivS7x4IR2tvEXYqMZEznqiy8avXzLRUj9iFBVXtdQdxeWEIxhjTIQF44wUDUOREKaep3YGx1pe1Av7Bscboxp9hB2S9x2+/U7r9jqllxTlCInzjVMJYaRNBhhG001W7bAmuuZDRd1f/e3f/Vzn/3YqnHKuR8Cn7pZzZAQM2JGyM61kcE5kESG1rAKXpMnghI5EVrxjV/Eu3EoADYfiXjfezZtXlNStRDDOLir3s1e1CQubOLJa7WiBg8MkIKZCXn16rHeWG/FZDjelW+xidR9WOsngl15xYYv/qtPbLmkCDzb6SSyRZZqpMupniHqdzuh4BBAnpYu2977wz+8+U/+9IPr1o3AlYgIkrMBECFiLxUxu2QNngtWITXvZ1006YLLxg4SOZE7kLUNFn+B08ls7sIxuG3f1Lnhyk3rOplUxRBEBJKTZgcJjLKqkzDFAOe0ON+h+uKLRlb1znRC3lF4V6b3nIia5I07hNi8KrvxNz9zY72Q/+7vf7z71UmhSMYpI4ZR00EeDHLW1avGb7j+yt/8zVtvv31bb6QJ96npAWg0S92VAPJMzKBowCCjr14lVgMJjXSoJywOssTsIJC0ZvGtX6hAs7WOBdqlfM32NTrIjz53cGGQTMsy9kCBzAXNelZkMo7s/X6H0+WbV+/csmYE+ecO+Tu2i/hdOa+YgKieiQxeMMG9D8BonrH6yacP33Pvk08++fyre/f1qxrOvaJct7579TWX3HTztbfceP0lG9eRJ3h26hCRupmi8VE11yFwBQXKRcWBycXd+04cnFpcqplDZ/NY/9LN695zydp1Iwhokq6sBmnDxbfGRDWwE4llsJjavMvoYi0/fWnq+Zf2HD3e52KVUlRDEIJqlLhgsxxiUenFa+SjN15x5ZaxmE5SXP2mPHynxZArgIqNAm9KlVBgEXMjzo5EaBxIB4JmmCEUOKP2TB8IjrjUx9RU/+ix+YX5ZC5rx3Ri9ci69WNj48JNxd8IREanhPWHrTbLL29+wVY9+LPJXc/vXhhIRayWu+jmWMfcv3Lr5ltvunjLeE/6J1BOJLbYVhbPKY4a9h1efOGVI68dnl9IQCicSF3LLNBBL+Qdm1Zdt/Piyy4e7QUQElbIro4VQEV3z7mOUQBuZiPcnUhVhTgxqboSZFj0gzI6p6F0dnewMLEBqnBABEggbqTBvNlTzRCAjH+OimgEs5fq9NhLcz95bt/xuQUU4yaFeY4WXHLQunS9fHvnY9e/75IJduUsHtvUzTm+mytDnO/z4cm5vYcnj02dmF9aMDPrddevmdi6ad3WDes2TEgHgFWwTGFkRfxaK+DCJlCMMefMYsTB4I18kDBAxaC/2On24JyzSeAz/EZMAdxUOJRIg5h5BkziKJrGAFCzjtMdrv7fprTcyQlT/fj8a8enF5y7E4qYQU5MjmQ8Wo4en1moX5u9ZMPSxolxLBc5W5zTTEBm4tER7Ng+vnnL+KDOqmqeOVi30+mwBBBrypoiMUK5Un6vFUBF1VqkkFAoAHhKWlcapHSfH+2NFGWpORMaVWgzN5zGQU1qwtwMHJILyJgKuCpV5EzEPpz4ZiKnAHvD5sLhsgq4u792ePbY8T6kF2JIVXZqelmhztlQjq4ZZLx2cPa928ZXd+Erx0FaOeg1CXJy7wmN9gIQHKV5FQgEJQg4CkdkR14xj38FUJHDkgNVKp55YffjTzz5yst7T04vjo9ddOXObdffcM0Hb7is0bwE8sJCf2R0/HSfI2FYbzcDDESNoDuLNJX4oYeK15e3yCkPmZaXuWTDiZmFOisE9aAP9ViKkJJbJ8R60C/LTk3l5PTJpf7aNd0OubYKcefaQSViCLl4hg2lwd09xA4Ay27uzZiiMZhXTJPFinBQx5cW+e+//eS3vnXv7j37l/p1GVZpmrrrzv3r1z/+W7/1kS984fYNFxWDan50dNTttLXSUzrRRErh9W0Yqs1qbReh5T1KyJqFCf908lSd3K3OSUSMYaZRgru5GZQCA57UEoHrnFOqoILQOqjn2kuSJsnR1I2dmR3i7jAwg4TgTmyADVemr5C02Qr4lknrv/vWj//Df/zB1LQVI90MFbLaKg7h8NTCX//Xb5nO/cVf/E5RFGYD5ngGj+TnNgcq1OGBO2ik3s1pCBHm5RZS/rlPWBj0a0suwcnAlI2ISTiogpmdHcRKUEINFK13es5jxWxBmMCNuqKZMxN4uEEDZAQnkLm5mQMiK4OKK8B6735l4VvffOTEdNntbVtcYOfSyGLHE1WQMDMn3/7mYw//eD9bSd5zo3+Whw5W56Qwj0Qd9xpIzMZsgLm7+8+nW/5JljkIFYUxZ1AGJSejoIhG0UApW21em6sIQpnbDXDn3EsK2ak21I4MUQ7kjOQ2vDrdYQQjtiJQJ1Jnpfxe76CDop4NCYDl5vTXhpQdP3rgqd17T0Byf3BY2CM6MLbMhQZGDcHUjN15388GVJOcabT3VHs+AUIcJURiAYgLUAQCEIhk+L9oSFrzxow28SWSSakwM1eUiO4I7KKVywBcRS6MULoJQpEQUEurEHfuHbmCUTAVxKGJIAiIxAQmMJGQMHhZFnzl3ITvoG96KsAe6rWBzDAY2CuvvDoY1MwiIjEKYGZD19GN4NzvV6/t3Tc5OW0GanfLtFiZeGddGss+5Otfr9+vjhyehAucm6En8+zN2nfAnWIsmWVycnphYQlMaK1Qi5aKv/iXafrLTnGSmVNtmiWEwqxRxUwAmkl8eON/cBF7mokpEqSV8G7RUvEcBuYNFYlAjQCpOwEIITQlehExMxJ2INVZ1Zvkpzf9+S1atFT8Rb/Nsva2uzsa6UR53UgKNTto3YhImn5RW85uKtzM2j6zFi0Vz4k5pGVOnoobhYgaiqqqmQGcsxIJyIhdRMBD3W4iB1rJ4BYtFX8xNGbQzOB+apaMiJcFuc3MRCTGaGZuxAyzbKaqWmsCwMTtvqcWLRXPgUl0D8xwJHdmYjO4uwQ3JSJiBjzknGMBkKkhWE/YTPqQUeQAZJKIJvXjgAPmMG/+bpbd9VRayMxO/fPNr4ZmCw4pXN2d0DSSq/9TH5gctPwcjUqmxcwgCyqJrABlV1iG66mPHf4loVJUhtclN9zfSgJYtdFBN0cyr93V/a2MvqmbQX34yJq+zuYr+fLiEH89fHj9Z5i7Lj9Jg6eWVG8N78IqnKHvQxPbFCsZgLoG7i2HnX5K0FZVQyje3itGMgFDljkTDSPeKCUAM6gZEYksb6DD2e0CkFNaq76csxpuHzi7nrumrutw10ycmQiAWhLuLbcKunujB0uADepKRIJIk/r24UNtG/1aKp46+hSJhgY/O7SZq/DQWDMn0NBigjmchx1tZjVxGPZM0uvZKc19keHYlvtbF4ezRrsXr3+Ag931bFV1TFVECOQcTvkVwpLVWYZbK52c4AZ3R6cYaa4SXy4Fm8MNod0q0lJx+SRKzpmZREgAcxduzmpNoGa3lLk3M4ogebu9dKISzg5qsr/uzgxmFg4wBwzCzS7BUwmqs+WQAw5t7pdTzX1n+3KZcaqHqdlzzgKgoZaZqZkxMzETHATNdRM2MDXDKQZqbpmi5VVLxWHMGTgSAQ4GmOCWzbKEzhujOwBuID8Pz6BpRDURbhQhAQMUHs3hDgZIICLunnM6W4eZm14/4uXsMcHkLegHNJ4zYDwUxmIzMzibEDHTsDHRDe5shhCzm7llBxOxUKNp0qKl4ikj4QssJUCqrqohMhMxw+BN6pWIw/CsZjclvL2aC0RGZIA7avdGDUSIgvpiCAFgh7tLU7Z5C4GrDVXKh/23y0HbW8nhMcOhjtqg7gRq1oSogwBy8uXvzyJscOLAQBMrkpMb3MFtF3BLxQaZC3euK1+Yr2ZnF+bn52fn5xcW52OMve7IqlWr162ZGF/V7XWZuQan8DZT0d2J4FBVJZIgHXfkGh5H6uaME5jcbZgROVsaGS8BER6b1JA5ESuThrN0FBtJdRAMxCiNgjuqAao8mJ2dPX785PzcYr/fz9lEpCjKiTXrJybG161Z1e0gMDEnghEU6LW8aqkIAHteLZ57ds8Tjz+/++UDx6ZmFheqnLOZqVWRY683um7tqh2Xbbr+hsuuf/9l27avWj36NoeuJiQgcBDAeXEBe1+d3vPqoQOHlUU3bRy/6upLLt02UnQISATDWV4NOfcO7p9/6fl9B/adyNk2bBq94qqNW7auW7PqbK13Mxcm5LFKOD6lzz2z/8Xn9+167tjU1NTk5PRgULuhKdyKxLIXV68Z3bpl9dVXbb3++kt3Xrlp3dqOsHE7ofmupaIHkAIRYFBenqzPIppSUWB1IX3PB5nXHJmK9979o+/d+fjzz70y6LtwL9UUpGyiIHWgoBMzM8dnpnbvf/6u+763/dKNN9/ygc/+yxsv235prwA6z12EAAAgAElEQVQ74DUxmTtByNkJCmGCNCPFwz0Yp/maBKCCjaAZKvYIruHRvQ9wyolD7+DRxa9+9a4f3fuTI0cncxIx6ZRh08Wbf/VffPDzX/zI2tFuwNzpqGhQgpFHy2DxZIscejMz9N077vr+HT96+aVDORdE4lZt3Dj+kY/e9MXf+sIV1xSa50Lgqt8pu3AEhZIJca05x9BLtUtMTKRmwuooKuNX9ux78JEn77//6ReeObLUD65vZuW0Xlzg43MnX927+74H7l+/vrPzik23fvTaz/x3n1q91t1icBEhVxBznRGiMi5MJOlNhcadcap1hF/37IlAb8yZ2YUqtsuXvvSld1bShQzuICEyd15c9B/c+fCxY4tAcFIQAw5yclarithJ2UUwsXpsYmLiu/9wz1e+/N2DhxcXFnIMY0BpTsSspg5lFs2esgMi0ss1T07OvfD8/qcf2y/cXbd29fh4BJmrMUczMBGIDE2cZAA5UXa8tO/45FxyBIHZsGxiQNN85+ZCZB3g2ssn1owGQJjjoLKi6B46PPg//re/+f4djx45skjec/RyIs04Md1/5rnn5mfn3nvVdaO94nRVDR9qtcKcWIglnDhZf+2rP/y//5/79702SGl1tjVmq91Hp6fTy69MTU0e3rp9w4YNa91SjB1A3YmJQMk1EgpmMIM8EMQJjPLlV2a/883n//N/vP+733rmyAFVHU31aXO6DoaTSI+sM1gKRw7NP/v0oUce3q1aXrZja1Gy1iBh4ixidbJwgXanmyqT89DzN4eapZwrCWxQ80zkzACpITuML5B9WsEOKpMTuWrqux0+vPRXf/39Y0en2Vcnp7KcIAqDwYBYmEihImSuEI4hwkNWBFkdZHVK9bMvvnT0/zzw1NNXf/Hzv3bjBy4nBsxFztlqRAeKsljq4x++/dBddz21sCAsq1JiiaHJIpXl+Mzs1He+89Mrtl/7u799fVGc3uySO7SRF3Djx36y+xt/+6PpmQFJJEZOfThiIcJFbemuex5fv2V008W/M7EqAlBTpkBwx5LIKDzU9ZxEZi5TjiGEH9331De+fvejP9lbpR4J11ojWSzEVE5zaSZ1Z2dHIOcqxcXpen5x8sChv3nl1Zd+73c/fsV7LjGr4MYUi3DBKhwsRiCAmpZKZhEOwuYaWN5YjHXyCynev4L9ejdJKTFTCMEpTk0vVDlm6rBEB2dTMEkIYHGwgShk9YGiMqqyVpUOktfOPjq2fWpy5I7v7P1P/+HeRx89XNdQf3Nhjrf2mswrIhw8dPzOu36ctYxlCUEsyKBFT9TTwqDf7Y2dnEk/+P4DUydO+pn61hgwDg7g5Ax++MOfHjuaATGDagqRJCClWlUBVh7/x7sff/b5A0DpDmY2M3dim4CTey7iOHkPiIMB/u7rT/+v/8t377/vyPxCN2eucw4hxNCpKzlDvpWZidxRJV9yTihy35YmJ4tvfuPFv/xPD77w0nHi0q1ZwHzhGuKGbclMxEwCFzc2Dcudeqq5NssMYnq9P7G1imfz1aVrhqJkwJLllKwsS7WktgRwkCIW7M3gFDGcUs6E0ER8sWQ3c0/MNDtnnU7pXt3/8MPJjv3xH/+L2z5yvXnF56hULSxJ88u79x44MKU2XqVEbBKKuk7CEBFNrmoxjr/wwr49e/dt3jBxmougmRxjwEDh6LGZXbt2F3ENzECesroSAEGMHODIRFNT0y++ePCWm7dz02NkREwgZO2LeHYId46fXPqH7/z0//2/vjc/L8mJpXQiFgeyucdC3N78vtZUACBhkaCeWSBcZEvMujDAnXc+NqiP/w9/8mvXvW8becVkF0obmKiEuTYrGPj1FohU14ECMYsUTSyOZml7S8W3YNLNsmqSwCICwKFEWhZsBiYzM80mHAJHVRUaC4HNLGttOTsMsBC41xtTXwpCmtY+eP8xT492i43Xv39jyf7fuppv8SE7Duw/lnI5qKTbK837KWlZdN1qVy5iL+VZ5lD1MTtTu5/GT6IMj0RilpkxPTWzuFDVSozaCcJGtCwe6dmzGZemcnDfZFNRMVcJJdxBJBiFQxjHZ/JXv/LIX//VXbPzCq6JSxA7nDloMlXvlSMJ/dM4ftmdcs7uPux+MzJlEmI2p5F7796r9T1/+qefueG6iwdL6FygGocpOJCAADXUNux+4FB0smZPXkSYmVlmMmIndFsqnh0Gg6XeSBeQukqWEGMJM4BSbRgugyIRIYK7mmXikLO5ZQJEIjNg5uZZawo6qAeBRkOx9qlde7/+99/atvPzG0YnmjL3L3wWEAKWlpaEY5BOqiuDBpK6HnQCOyLMSDJDgHh8emZI+zchZJNGJiIyYHHQd7JaF4uiUM3OzkEc5uqeE3MIYp5tcWHgCmc1M5ZmqKLiUKixGX74g8e/8pU7T87VZa8cDOoQ2Lyq60rcYygEhWc6XRBjXgEAMTMFDssmm1zJXc367PGhR569aEN52eW/PzYKXKAMatO+59CsKtJhSJUwP5cPHj2wsLAUQli/ds2aNaPj4wWhn2ypoJaKZ4lON1ZV393LYtQTk0nOdSxik2BUTURO7DklwMoY1bNaZmERsZRTUuHILM3GuFhKTilwp6rpvntevvKKF//dH918jtI2NcAseXFpPoTxbFqWMQ1yWYjmQeBSLUms88C6sQgsp/8cpSZxyZIcZpZSJSE4RQURIasOg38mkQCrAqOMRa60HGHmUmuwMEswr5i7996952++/MDcHBedkYXFQacoVZk5lEUEJXcFahI/rTPgZRN/NptgLYMIgUNti2U5MuhXEklz987vPbd9y/3/+t/c3rlAZ808MzGcg0Q3HDho99/75IP3P7H74Oz8/CKZj42VO3Zs/PjHb/jIx67buLF7oc7zSqAiZbiAjMjdgyMRGVB60lLGU509E4dU6xIi1S4QEhGDupqpSygkdAZZg9SukbyjVd3t0lI/GbF5z32mkF4eGAEUlzL1FxN9+W/vumLnxR++dVsBgymMIaSoyM864CESc3EbC7Gr3negUfrPyoSOUW0cPHeJQ7KUQcvTRm9y+QAANUNeYBJwAYpm9bC59ZQFJzIzA5lbnVUCuTExpEhq0eocivD8K8e+8jf3vfraSRfTXEXueRKRPrxP3gEKluxilWZQSawM1zSIgdm5qqrR0fGBWV2nEApmpFyTAETZjLirZhLYEmIsFqvFr//dP1521Xs+/pFLNNdBCs2QmLIhcHSriN/ebie24DpAZDN56ukjf/mf//4njz3XrxP5GndnopMLM4eOvPbYkw89+Mh7/+jffvH66zYxagCEAgbinDUH6bRUPMN39zovFd1OzrWaxSh1UhEkrZusPRN6ZaGWFvvHYhlMo4iozQeR/sCSYmyEBoPjTLGZVCIiJmIOg8Hg2NHjd9zxo6uv/sL6NWXWFGJHMxDecatqz3wJNKIHaMZTXJ2UOXKM80v529+858mnn61rcEHMQc04BAOFUOYqC8e6yiFSFMChtrh2PW/fPrFu7Win05ubrV7dvX/6uJnVRRypMyRII7ZQlEWdzEyZGZGbcP3Qkak7vnfXtVf//ro1Aa5Er0fhdB62ywjISwfd/8DLf/mX337muf39xMLjdU7MAUSeC5JiYXHpoQf3TE9//c/+x1+59aPXwGu1HJdF/t3xdr/5FUxFIoWoolJkETGnlFKMRZdHFxfne0UI7Kx5fHRsYmRVSrqUZquqH+KIW3DmkdG4uDATC85ZT/VzEYWmOycnfeDHz/7G5w5ddPPlxM2IOpOzal4xxR5v9PLgbjTsDlACQLL7lSMP3v/8/Nyg7K1OqXIjd8/eB1AnE5FsNceCWZPOXbx27a/82qc+ettVV165bmxVECJTHDm09ODDz97zo4eeeGp3XVNRTKjmoohLi/0Qo3lmcWZxy2W3m3P908deePaZw7fddilowNIxE6JGTuFtv9ycBk7y0ivTf/uNe5/atS8rxaKbMsXgTOxOyUEoA3dn5/q7dk195av3rN+46T3vWcOc3Z2ImYrzcAOvYCqaCxGyJVAwC0zULUdSXZUhr56w99+w4aYPvWf7pRsuumitW5icPPHsC7t/tmvvrmcODioxhyFIsJwhEgnMzKqeszGDKIB4bp7u/dFT77vm0omxoFqJBIO455VzVZGZqaq7MzOgZiaMxUH6x7ueOHqkCmFUNamDjGIUZzMVd+fAqV/1yljXc1ddc/Gf/NtbP3bbh8dHo6EiLOWcO2XcsUN2bL/pgx/c8rVv3H3HDx6bmZnr9kbruh8LEDGU3E09a84sJXE5Obl0z9273nfdhjUTCjI4D9fkvf1zVY5Y1fK97zz+wP17gQ0Ss5kJRfcZdRWREN1QJY8IUYkfefjVHZc/9Od//tmRDptmIlledE0tFU/ziC2YWyg6blxXXhZFEbJpvW3rht/7vV//5Ceu3XxxETinVEnoMu349Kc/eOiIfvOb9333ew/v2Xss1YG9F7mjfhJwETBLSure9LqJWfjxjx//7Gc+ev11a9UGwmDisHJG8kSksYKvd645A3jx5UN33/2TxUU2FrNKJJBzo2SpqkXs5DyQgKQLO3du+Is//+Inb7s4iKSUyAuJZcGAuUHJ7eqdm/74jz5fxDVf+/rdVe1pQJ1Oxz0zs7kSmRMldUBc5aGHn/nN37lhzcQGN3N3AZ2H8w3AkV/dc/ie+x6sUsoO4VqtitKDBbVMBA5kZuYDhZsScvmje5687fbrb3r/FuKM8yU3v4K7bcibAXzK2crYyXXd7x+/9r1b/qf/+ZNf+Fcf3Lql0HpACEUcYbAmwKpN69Of/dkn//zPP33ZjnHPiyH6IM24e845paSamvn6BrXpoSOzzz570D3GWOa80q6q4UG3YZ7TEaRUxaOPvLD/0DRLASYREaEm75JrJYd5VjUhHRuxP/iDX//Uxy8PUuacA0uIBHd3cwJzIKnrPL91S/Fv/uhTH731ctjx0XFOttjo3JgB4KIomJk5hKJ75NjJF17cD5QEYVr+INjb/xzKBx946eD+RGGUgxBHoQ7UmTpCPXj0LG4sFDpFGaOAi4OHTjz60HOawcQEU337I8UVTUV2CCGngWqKBRMGl2we+fwXPnH77Td3IzRbGTtwpFSBksQkKCPHguxTt9/0+1/4jbHRmFLV6fSCxBAChjqruSlCqiYK5hZ+tuu1hUUQ2Dw3sc1KeT6qSuRvUGeLQJg5OXjsiVfdo4upap1TSrV5ElCkTlEEchNiEbrllms+9ckbmBLAIRRgzzYwSpDGkU+qZRG7ZtWGdeXnPvuJizeu9ezwgpmJiMCNb6yek9YGd+Dpp19eWhz6zssm622nYn8h/ezpV+BFnebB83W14O7CnnKF5XjVFZZNk2qtyauU+OmnX5mbH0ZCyyunWyqezipCGUrkReRqsNDr0Yc/cv2v/dpNRQBcQzCSrDoQESDmHC0pIJ5yr2Of+9zNH7vtSqdFp5xzJmpmHYZ/QE6MED2Z737lwPxcMgOHpmFqBT0xo2UuNi9aM6YmT7y256g7meVQCDNLIPcUArvCcmIhVe92ys985uOrVhGhaq4ndwrSYSrMhTiCAwtlTcI1oX/rLVddffWlKS/GglSTu4sIkzhhKH9DpPAXX9pzcqZStUaTjvl8UPHE8cXD+2ZyXYjEEEIRR8S6bKWEmngASkQaGzkQokBMEUZ88MDU1NSJnI2YmFlNf4mo6NCmA5Ca9RfeCJ/y8rwiu1Mzr+hO7ilzrejBuoalSJ2JMfnN3/joSGmMRmQlAEFChzkQEAOoTAYghhDqiS4+9ysfXb+q1IQmKG9qdXByQ7OpDwMhlAePTb3y2gGwB3a36i1vsH2DyDKdn4oIW2YaAcVMKkxq8wj2+FMnJ48vkUTzynI/gMmEUCSFB1NnUwqsGzZObN12WZ25nzrZNGnOlupc1blSTZory3U1AKS7lMsBF+jiqmsvdV9gHzRyVUP32JyGLTjGzIcOzb22f5YiwUuCkp+PxV8nlqanFwY1VSSo+4NIAxYdwODRLTRjpgZ4o3pCTKYhYGGue2JmWgKbCWDh7W8VWsFpGxFJlXIgFrGkV139nu07Lj7DCDlBQDA3mErAziu3X3b51mOPHzkTeRyDwWBycjKlzWUsmClXK8eB56GLSERwZ+Z+rfv2HXx97OOftvW5a9MkCAmTU3Nf/q/f7XWVqbK87U0/v5Bca2IxMOUcXnxxuqAdVncQpk/jMHu/Xx+fPml6UTODrebnwRYMFuu6rolECCQdb6TrJJxuCsOMstkgDRYH/WWJV7TFjDPaGXMzIyc3I0/vu+7yNWsLaHXaKfjGU6NG8N83X9J7z85LHnn8tTMJWDillCcnpxv3gVbUchxib4bTAZiBQ1FXun/fYTdyb2rr9Ib/PBTU0GxgmplN3/nuIzlVReBMD58mbYaq7nc6BRHVSUPoUCFaGZ1mokW4IAxmZxdECMpgNzsf6hudciSyMKlmMBWOZAT3fLqfHKQXuAqBCWJD6a0aLm2J/0woimhQgnR75fYdmxkg4dP74mIE+v/Ye7Ngu67rWmzMOdfae59zz+0AXPQgAYJ9T4rqKJGyLMmSG1mSbdmWuxc7tuNKVapS+ci3/5Kv/OQzqfglzkv3kue852c7Lj8/SbZ6WexEkQBIsEEPXNz+nnP23mvNOfOxzwUpmxc2+QCC5OOqU6zCLeLg3LPXXGvOMcccg5hjdEsSipsP7y1Kzu3Vsnd3Wl8bBinMzAnvLlNjZuoUwzvJ45yxvlFvkRkmIsjuDvJOsEDdnJyAoqyaxgjT5kVrK9ts2VKKQVa4e0opK4oA4m0zzrbNVcHLS6tmE7O+EATXHxHpVVVZsOrIPBYsRmBm9W1r1NwYl5mh/anKJjpg/DYcwu9i2EY1dTcjQaoyLCxMq9dXne8VONR0In5Btmfv/FX8GLWbFXLa2BiawQzvLmccd2fuNJlVBHAaj5rRsO4sK9H993UbQLh0pxBCttTmOmudrR3Ww4jwhq+6SebSZlGLsZgWrgxBYnn1ank4HHbScm5GXb1wndfc9GBh91yQVBaBKeasZtnJtj+/gul4ahD2LMxvJfP+NrgivZsRVHZL7Zb3MKoqMllO2yJdNnGk4olHI3RmdhDCVejdk6nH9Y3huGkJzMQ5v3sMxp271NTdQTDLo9FoY2OTiLbi8MdLJIOZMUsMAUCIVBQoKjOlN3yFyEQu7ICrZnc39abZdlo/BAY0FuITRG7rs13ntWPH1B13HuDQmLUT6szEhuCNVynM1B65ZWHnrpnIExGTtyOFefeGYpTAzJ2qr4g4EoHkapMTzAxhES4JkUBwFr76UIx1SsFvT1VzrSNRXnO92moquBu2a41SGwKrKlwsw7JbaqHZWd7wRV67jphr5hHRUEIrwV7z0vkHK+WaBXv3LrgroF00Cl93ZFKCPvzQHbOzRZvGKTUhCDNke0eR1I6r0j/0wft7VXR4V0S/DU//XRyKObcdBtM2CUBd1+ZKga9SOKmqw9XQ2TAOh+NU56skeO4eQuj3+yFMCMFdd/FdEosTZhmxmxkxlb2iqioiesPnnqwNUXI2NxEqIhVCkZyN0xu+xPrskT26CxBMJSdhmtr2tinj/PzM0VuPFEXovn/N7tefVybiH/rwg3fceWRqqtflye5q23OJY0G798x99CMPFwLXzghQ34amy7svFGlrgSUpqeeq6m8Ol9bXGrcAR+dl6K8LJzMzQ0POYgQTBwdJsIuLl9TqbWtFEUMOhJlp6pVsaDscdtsP5mCDEYLBCXLFmtzZkYMQQcxqYjfdMlcOkik5xJupHveYGicDMlE2pGRjRzZv3VpYAlQzCAaQ2zhbdk62PY5EFIXboCzaI2SHc+hVMwxygA3uoXVuwOTGUESO7bgQzIVCGlvOXLsEh0iywkiSS/LSJWSnti1ciYggqipg4UAUQdEhTnCCTYh3QsIGz6ZR0xd+7vF779uZMHIxMyF29rdB8KbZuxs/99lPDgbOvbFJbNtCfEa4NR0Tw4nBQsJtbomNef3nf+6zt95akYNVYESo3oZQfFfTwUmkM3LQepxeOPHqpz95t6dWuwYiy5aFeCcjbAHBwewAwyw3Lb368mXdFtOGQIhCzrnf73cup4a3RF8mApBS6pyYmNkU1oEWBiIiJqWsSt0AAEwUBFiUHoCcU4ziZim3ZShMwRIChzL23HEViTJVJVHDazaxVVVNDyYmk0RCrlkzkxWxJCdQztYasrajokC/rMnryKLqIRRbrJ22k4EREeYGZMkyMMneu5pKjInITbpmplMeTFf79u3+yZ989DOf/shgit1EOBpYREHpestPaWYO+NmfffiFl179X/74z+txPTMzOxwvWapiLAmS0jgGkcCEzOBPf/rDP/W5j/WnKKcmxLKbxeHrn6G+m0PRCWTuBkSW8vixM01LvSKU6NgzV8ZSzaAppRgCTEAOTkwyHuKVk5e1BRXbwTweAhFsYWHhtSYv2Vv5oEzuDrIrXktETkJqxkxwYyaDMpAy3DgEwMUdcMQQARCj5MJ0gkO2rY/GGc7MjG04WSGwMLF0f4UdWgTsnB+wmzoLBSAAuUNrNNXgJhSV5ZhzuOXI7b/1G5+fnS7I3cgI0pG8twQXyd1TyyLSUesAYyjI3L1RE5EQgnoOgacH/enpwcxMtWvXaGaqD8A8dGNbquas4Tq7o0oIm8PVqam53/vtL0GL/+N/+8vcqqBX9ilndede2XfXZjScnx3c/8C9X/n1Tx29ZWBotqLPADbPcp0bWe/mviILkZOZqgrRsedOP/XkSx/58C1wuE7AQBAAJuEixtS2RVFoTsSNe+/Jp156/rlXwLQtmObORINB//BNB3L2ItJbPTKc0AlekaNzHWcRMerwE3Z3kBK7gVeWN4mhOUsgN1PjGKRNSqxRWHOOpXedh431oTtZ1u3Oa7MMZLNk5F2S3Ktw9Og+4PtQOEVTF46d/5QRxCtTgLQI0rbrDz1y4PajU0IwuqLLyldsqtzAnF/PfGBMtLfJY86QCHek3BaxIEDVhfttY0XBItK2bVEEksBvhyIj9XuDnHTnnPzB7/3Erl3tv/rXXzt1anXcVEEqIWmbGhgduqn89Gfu+MIXP3HPnfvVavK2kL6rkYSOHoL3W/xXuWyIVERyMgDnzq391V/94L4HbhlURmGyMwCoOkEAxAIA1HNEWNlo/+brPzh/YbkazKc2b4PQiuto396Dhw8fpK2eor2lBpO5hRA6c/srke/uBO78HEDqTK5y8qVz47atSlZvRIRF3BGjOJCzhiJmW89KkMHp02dzti7p3T5HbUJkd4UT3IPg9tsPzgzi+joRcaPg2CWTGkIg77dpM8ZA4OXl5ePHnr3t1gdBY7IeTaBOA0HVmQMx+cRSlmkyBuwgN3UJ60ZO3ssWOBQA1BoRrmstu2fgKIpCVVnY4debw9SNa8XAcN+5Y+q3f/NLH/3QZ77+jSefeOrE6tJGPU5zc7P33Xf0I4/ecc89e3btigw4NEp0p4n/q5nwdT8y3tWhOLlViBCE2kTf+MZzj3z4+OOPHZ6qYrbGrS1CwUKAujHIU6pj0d+s87/76x987W+edinqdijbEN+EtE3jwzfv37lzSiRfwYzeAs5kZr1e78ofHejGQUChc7cHmRmp8gsvnH32uTMf/OAtptlyikFyVomBsGVITBLj4OSri08++bzmrlm3TWJGpKDBoE9Ehm6sxI4e2bN778zmxhK4T0bu5p5zzjGIMIMicdE2WYf8l3/+1MMP3nfzoTlmdGoAxM7USc5S94vEGIEM5KQNgBiiBIx84MQnX07f//7xzY3h7oXpg4dm77pr72wvA405w5g5iohZzt4Wcn0FUjWHWCCltRDYEbLbPfcPbr/7I+sbDw6HY6YwNTVVVrEqORDUFCQycaokpq6qp4lF7fuhuA1ITSAx7ciBCoonT6788//5T/cufOWOuw5UZc+JtoTQiJgdHAuuG3zzGy/8yf/97VOnh4OZ2brd3P40rfs9uv+BO4pyAjQTJn3zNx2LoNnZ2Rhjm7dGFhzuRCxmRCQOGJw5nL+4/Fd//eyRW27ZtbNyrbvjXFVJnBltgsTBygr+8s+ffOmlVUMx8T56w2ZPMikxPTsgYQJIxJEP7Ntx++0HXzh+1nXMEhwmIt1ua3XsUPNWCofTd7/39L/50/1f/uVPLMzOhMBOnHNDgYgwEfyHOxkzHGApQEV2bKzr88ef/+t//+1vfevYmbNrOVvgdPNNc5/6yUd/5cuf27t/likbd9OLRCTF9b9tWNRcY+ybO1PRL1E3WpZx93y02SlHAhswFjDATEbouSG5xlACcE9M3VfE74fitgihBDYFC8xykD4hPPPUyf/mv/3nv/7rX/rYx+7eMVeBLKckFJhJHRvD5q/+6tv/4l989UfPrfd6C03TuMh2W9k9zc9P33XnrQQ4zB0g6FsiagnTzMxMWZZJa1ULRCLBjDqVXmbODgJiqJpm9U/+1d8uLCx86QuP7N5VpaaNk1yu44tiPMJf/7un/+X/9e831tkpUMxusg1sE4qynJkZCLNrJ01fF2Xx8Afu/frXntnccIepalfEqpnauKpmmpQACKaGm/0/+h+/trmGX/nlD+3du6s/JRILhzkcnT6ek5maESimhOVlPPHEi9/77tN/+80Tp86dh5SGXaoamZ47nl5++QfrS/G/+C9/cWaOhRNIU8MxMjxc74Yay5hQZRUiMkogrUoBHFmZO1UkwcTY3JmhGVJExgSBF+asTZDrro96HUNxu04MbV/7GSk5EbrHY+5CnM1bob6iYYZ7VBuFEMyZGW6QoAAcIfkIDPjgmR8dO//f/fdf/fqdH/novXfcdtPCjhnLury8+vRLy9/9zlPf/87zq8tJZODYZCC4wAKRdvr0ZgwnBAcltuqxj97/4P2Vac1SdfCmxG03TtdPY0NmkEOvUIgJjeott7GDQLUAACAASURBVO6ZG/SGqxxk7Lah1ndO8JoJbkkQAGQdCk3X45U/+p/++NSpYz//85+87ei+AVkRilTrMKfTZy7+23/z9T//i28tLjYc+2YBXmaMI1VigR0OzZ5B0SBjbM6U4ejheTEwKywUcQbQxz724F/82+/+3fcvgAI4ZVOhwlKOYUqTBnSNxwYRmy390b/4+hNP/e1jn/jQ44994ODBnVWPI0vgGEJoU9aM0bg5fe7c9//u2De+8cSxY6dW18euOwQFO2XTQO4wY81Mf/qXX3/4Q0c/+9n7hEqQhBLqJtdffJEwABAm51V8rXcSAl4n/EMywZ+k6PrtvFWLxCBvh9vHO+hWZGLAqENb6LWCsKubDdaxt7awk20foeXbzp4dXV48+42/uVAV0qsKhrRte2l9sW3NtYhxyhBSatw1RDGkIEHVzSbgSk5tiDI7Hz/xiQ8PBqVT7o4WIld70xI37hpZBtN86+17Lyy+kJ2EY07tdnBF1psXL27+v39y7FvfPHPTwd2HDh6YHvSbOr3yysXz5y+ePXe5Sf2i3Nlq1lwTZ6GoqsycLAEqkbO3RFwgLuzuHzy0QAQ4d1+YK+3d2/upz37wmWf+93EuA0vSTOwuRlemY51ePzDx1FN84vjT//L/PLZv79xNh/bt2rWzV/ZE4qi+vHR5+cy58+fOXV5aGY5G5tQPsoO5TSl113LOWc2IJLU+Mv/q17/1qc/cXxC3SWN81wh2vT3reobipMNOrwdarrS8/5G/1xVU9Jp1RCdL1LllmtlVzlKXRMytehoqjUxIicSNGDsjwzuogqwjr4KcJZOwG0IRyMks9/qFa3P/A0cefuT2Dqjv+orC9BamuYmIQXOzfPf9e7/2t98zn07ZKJjYGzc0lUdhQG3Or5y9ePrCpfDk82ZmZgV6BjAFYh41NbOVFZsloB8LstySeIyxyU3SHApBig8/dMf+/XPYwhzMMpOUgsc/ft+f/dnXn3zqMnGPPQEmQVzfOPfmioc6Xr+0cn7p4jPHjptnqInEbDQR7AAzh1CV5qymDIQQkiraloiKEElCzjklvPzqhbrxKNbZDQnh6gjwf1TrOn4L5CBHV1zA0WkrXGU8zeFvAEGQTXYzM15n6nKV52e+JjIOhUowDsjI4zSsdTPryLw2r5OPzBtiI+4u2DJnk+CqqsZm3Iw35ufLL/3C4zvmYdoAUDUAWfNbaGZoznAqAh599L5DN+2AUyym6WohXbsld2cqiKs2c7YQy+mWNxJtKo+Mx6AEciJxl9TWqilZdqakyMoh9swwO4ifeOzhskju2tH1zDOYzDb3Hwhf/OKH5mc9jYfCBkopj35sM7yOMj4ej+FSVtMhDswq075R37xUq0BTEmaIS81IKWtu3XKTlEPoStAQQs7WjGvLDi7L3rSZJ3utF+o30NDwP55QBNPk1Q2pXvnjPxF03LpIO1WISYt8e0OJ1/qBxGJsjbZ18mRsEKIiBGZ3NudMpEA2yxOtXq9y8hBCSilIGTn2CvriFx77+GP3AdoFvgh3h8tbmCGVEIhIc7rnrps/+ROPMNQzXYVwx7mgVAav2HtIRUFT7NVoow2yQDab2h4wXcZZoanUsOVYltGRq6pw0GhsjClBiYxPPH7/A/ff6t5OdM1ee+RTZex/6pM/8fjHP9wrK9IQaVpoZms/8I/VvkC/LASujaZx0uSMIIimRIDmnOrGEzFiRCgoFiQi0iWoMUZ37yzoiiKYN/v37qqqUMXYHWgdaPR+EL7jasUrtVNXD3at745ppaohdJz6rdbc9vxc9oqIAhu7R4kOZQWDk0U3JRJhSGB3V01mFqiAFDlbURRtuxmofuzj9/zqL3+mV8A1E5Gqk5BbDiGEt6SG2h0lEvBLv/jZE89f/ua3jk8PBnX9xkx05paIWKQjEhFRjEzcNjWKomCjnBtn7sTaiDjnOmtLgpy5Vw3grs3K3Xcf+JVf/uTOeWGKnfuhw1miuxOrw3bvLn7tNz6xuHTpO99+rmmkV021mV53QNtrAWkwNeYQZOLcRiCCBxmZGYSZHICpmjmRh3JqPG6LUKq6ai7KKPA2bczO8McefaCqwDA18q3n+G5yIXlXI6ivn4KhSaP5H9m13bNxNyKEEAaDAdHQTInJzGnivrvtI8xeENzcAG8z3LljXYtw92HMPNcZMBYKoWAbg6UZt2VVSBzec+fCL/zixw/sL62zXyKBkwOqKXBI6U0nVKrKHITQptFtR6e/8PkPvvTiC+cuXpC4jbtwLFJK1jYiQgJ1gjo8xFib1QBiEQjSCQsQUYw9CV3RCCZr69W9e/2zP3XPww/thVunhO9scDCJu5EHcwfb/Q/s+/KXHxuNRs/+8HTbjLFNq10C1JIjgwTw7IBDVQMxEAiszl3FKIFEJGtmZg6SWyUSdmvSZlHK5z7zocc+dk9AcjORUtVZgqm+fy9e91BU+N+zle9yy7B9MJobOb8+xmIMs7OzIpd1a8DM/wEa9PffREaAgUFbE01CQhDTUaclQeCJv5JZalMZx65lEQdAfettC7/5zz736U/dT8iMAFUQRKDwEEO3m98CbEPkOTVBQEif++kPXF5e/V//+M8uvLEwGprEzCVzdICYXeFOIkKaARC5Z89u3Ri0maUWxG6EGEPTbMzPyRd+/iO/9pVPxphyMkYBKGBOMkkooMLkaFqMP/czD41rc/va8RMnf3xy87WLsc3uVBDDCNmUWUQikZu3RARighDBoRmachaGCHeWODGGNm0UpXz00Ue+8pWf3bmjBDaJ2NWYGJ2bwPur26V/+Id/+B/8Jo06tx0bwVtoTUxqQqTLa2tnF1deOnvppXOLl1bWNutGYkEcAsPTiBBBcDK1Fs5MxCRbkj5EFAioSiwuDb/zre+kNADNKBoJ2TQVEpQK1ZZ0XIneeesRUNisk4WSc2QXggcRIoNbIMCUvW9OTi6R1HPOmcBEAdwDudn6fXfu/8/+0y9/7jMPhpDhI6LoHLwby4MDnIla9eOnli6tJ0cQmHWlZOczRQS4uRBZBdx/69yOQQCEmQADG3M0RRnlrttvqWJ7/IXV4cYGszg4Z5UYnU1dAysTmEGdbzcyODlqkuTUOiWIAgp0ox7gQpuUqtiztp4d5N/8rZ/+7d/+4uxMwSwsoZvCYmIG0eRcMHMlkoC+Kd16ZP+hQ3sXL7x69vzQTcFoUxPL6IwmtUVVhKRE7mwdYZZA7maqREmEuwHKTrFXWJgk5VyUBcEC2HOaqsJnP/Ox//wPfv2+e/pMAApQpE5d6BqnYZMmWJf7EDmg8KwkV2hrNjHzAd4GJtvbH4rmCkhkgsEtcSgaxIvr7bdfjN/+0cp3j609ezq9eIGOn80nzuQT55TyZn9qMFUV3VYDeZtSEYvt3r/s84njr168NFTzEM3RmAboVJMvz8/N5Xrz3vsO/Ff/9Vf2H4rPP//MeNiSB2Z2hyoRSnhMmZlLFufA7t6mzAhlWTEFqBEaYO2jHz36+3/w+U9+8s4YzXLLXGBLnrDrqgAwUFK82VA0c2buxA6ZJatXFd12223TO9P65rnly4tukb3nVpiBXITJAFW4MZEEKYgELppLQgUvLUdCyVQSIlxSqqtC4Ou33Tb/u7/3+V/4hUd37nTQJlO1/UXNbp1cvhUFH9w/f9e9947a1dWV8+PRuAhTmmNKKkIOLagyIzeYEcCMCKfIRSehDgQy6eam2NU1hRg9w3MSGd5x19Rv/c4nfu23HrvlyNT1blmYNWbJSbspLsDdusALoE4XYwI9AKRJWfg9F4qdiYwTWeYQhybPvbrydyfOPf2j04vLq406cSExMoe2TZuj0fnF8xsbzez03MwUq46FQ5DiKhnn/Oys5t6pVy9curQIAoPdOHCIRW+8Nj5yaO+v/PJnfvpn77799pv7vdnL51fXNy+ojoIQUScoTp2fijvnBOKiiL0Ygua6rdeKQg/snfmNX/v5/+S3v/DggwcCa25TDD14pwt4DUKRqNuolHM3cYusWvXkjjtuuePW+2LoXzy/2NQts5qNi57lnGly+fjEOdndzDgY3FRbgsUSwo37kGWMVOzZMffZn/ro7/7ul3/qU/fMTEdXCHVHyRtW493YZCfenXNuY4w7d/Ye+cCDu+Z35taWLq00TVsVJQfKbZ28MTEp2NA1ozRrS2xCIZkajAQkRpxATYzKRpHs8M17vvTFT/3O7/zSTzz+wM65PnUu3NdzJQ7E0Sk4OBtlI+dIHBg2AR/crhD6iemd5lp7DUKRiIngqaEgmeRHLy9/60dnj51ZhahUwpEy2qSNUSNRSWyocvnyWBh7Fgb9snNVkJxUtjmlmDfvunf/zLxvDpfW1zdIA5M7Daen0kMP7//d3//0F770cOBRFfXuOw8fOjRo2ry8dGFcj5nFshKBxYmNCI4cI7m3Ka8EXjt4MD766G2//7s/+3M/85H9+wvTJnR1Dl0ZPromoTjpwbjDHczkyO4axPfunXnoA7fedc+B6Vlv29XRaD21Y0IkuHCIIYhE4SAswqzYFHZml6Bu47ZdnerrwYNzP/Mz9/7qr37sl7786J23z4o08GaSgG1T1nbOpxPVGwJLp6ef+1V7z70HH/rALXv2liGk1dWljbVxr5hOAWAhDlmZOMQQnVxiLNXINBAYCh0FGw0q2z3fu/+hud/6Z5/6nd/99OOP337k5pkiIKcNkUQor/O1CHaImQACBCIBsXeq51d6YzaZKn/n2UfTf7j6nTmYDKbgeOLc5teefOnl5TT0GGGmcAKHSESqKgRmNokYNTtC8/GHFj5634HopAkSt1Vf1jyWENtE5y/W3/3OyZMnL6TUlhUdPXrooQdvPbi/X5ZmqnBmkay2vMZf++ozzzxz8vnnT7/y8tmkrp6bZhxCQSRVVVVVOHRo4aEHbvnAB+744CO3zs8agJRSjCWAphmHyMIMiG/xbLp5xQweNf6vv3H8h2dGijJ6TsSAC7IjdA5qySJxnnX8+ucOH91TwSNRVjOmQCQdQ2DiKmFwV5bo4NEYi5f8Bz944aknj79w8szK8try8lrb5GSu2R1KRIgeOYYQ5mdnDuzbffPNe+6957Z77r398OFmeroC4JaZCM5QglylZ5yB0HX2zFpiZ+aUUhEr08QS1XhtDcePXfze9048++xLr5xZWV/frEdt22QicdeUGwmhJyKx6M9MD6b7O3fN3HbLvrvuOHzrkYO33l6UFWLRFW9bQrOU357OmU1Y3Z07gaaUQgivJ4SYQQ0h8HswFB0wTZC4MvKvfv/EEy8s5nJOKRaacWUwb6KQy3AbC1dS2nD1tn3y04/ffXCu5zkH2R5YdbStxchgjNvEYiBi5txSrxAzwFWEsNVzbL0lCinJubNLZ85dWlvdWF5e3hhuEmwwNbOwZ/eePXsOHdy7a0dwh5B7cmZ2VxJWdWZmQttaUeKahKKjZeKUrAv1K6xaYQGZQ3NOHMSNszGTDEd5cXHp/PkLy6vrw+F4NBrl3DLzYHq21+vNzMws7Nqxd/euwXQZBCEgIFuHKjsDnU6gpbaNRX+bo7M1ZZGwdfZ1SClbdneVCHNLmoJEULG+sbm+PD5//uKlC5c2N0abo2HbtkWv6vX7FKtqMNh9YN/c3NzsXH/HIAjlgkxAqdWiqAAzT2bGFHPiorzOtZmOIAXAGdx1OJmM0bnZddrHxsSd29w7ELm9BgcVwZy4cRw7vXTi3EZLU8FF23FNXBSF0GTzMVHHwyjZCLnoDZY206kLm7vner0Ay76triEhRlYFzHqRiSgljxRiUZsaEEQEsGwtETOKSAXAEv3o4V1HD+9qGnVHVQqRdSNOXUeSPLODiRENUPfsQAjsIHMUJV8rKpIpcZAQ2CznbDFGIhIRd+TkMcYYoqoLUwhISWcGmJ7adfTwHma4w8wBsCCpRhECOZRAExAVXeEjnUQAMxzqbrHYdqsxBZIuW7ZOAsONmAsO6k6AMKEMhaqLYG7Qm58ubzo0434ri2RVNUisas3jms9furS0unn67OlLi7ywY2rPbH/PjllCWxSFu+aciS1IAEJRXP+97NkzjS2MWxs1rar2yzA9VZlZUbA7mXkRnPA2jQLfiL6iO7GMWn/l/OXlYQ7VrOW2ErIgZim1TYxRGDlnhzC7AJujjbKaWxs2F5dHraZKwFdJ3R3ECJy9y3cpxOAgI6vcTZjUwMwiPZ/wWDuAIHfeglXBIMltChIFDFbAHZ3WmiB7hoVQMEVVz96dl8lxzTxNQyjatg0hMBOzEbm7qSpYQhSDkkOEXD2rxhgBBVOn0EOwINwFTMnRLRNzR5M3B1FwdyLWbNzBxu6gQISkebvJB1UXYZpQsTsxj8kEsBPg2slJwRPABG81ikx4xEoREWPghVOL33rez19abpSIA8F6Ybh/B995266PH47ETmIxRvfOnaJlUsL1HflbCTOnzucTpxfPLA5XN2p2zM9M7Zyfe+woduycqwIRbekQu5o5B3nvhWJmosUlfflsS8WU6ZjBmeGqACQW1umLcOxE7s2oV7KrcanLy5vBI5k767YM6cn3F4jDj/2EETqF6dezeSamLOiallcCPBRXrjj5McZPwJVhCxHqvpDOC6nj/ThpF+CTB0m6fa6/Xfiah4J9mDGFULhaS1IKDEJoyIp1TlMojGHsiZoeyklzjK+I1jGBQSB67Ru44kUJXJmifA2LiNsbQV7JzZi7X3Yyy0eYmLl2byKhmPxU1BVBMiDuG475508ufvV7p5ZqJhIJEZ7MdaT51ZXhhScWi3TkA/fMBVcYg9nAnl0kXqtbyLxxRDaoA4HZRsxxA/G5E8Onnj12fnWUqVSSKHzh0qXFixc2zqcHHzj64K0HKh8iO2TGQPLOk5a+FqHIMZmvrKw0OTsCEzEo+7YZAMGJKBvAXLc2btqpXnx7PJZvyEpgZcB7lGsORDwu1y76Kz/gy5sIsLCj2L9H9t4mvV3IDSBXRlvfISCfuxMFuLkFkcHLFzZ/eOzMZh2ICCRgmhDHjc20VXvuxVN7Fqojuysim9gdi1xDi8JOjhowEcoAcQDiK6c3vvvMyUvLGx56LqUayNkBD3R6OdXPnmFMfeDWOUGrBgl+hRL4ngpFB2fLl5fWzMypu0GcybfX0TaAjZgRsiKpXU0B8d2/YloWnoaTcATqSz/6u1M/+GZz/MlUrynaaNNTNx06eP+jM488Xs3tXUU1/0ZxeGU67Ab0uyiYwYnVAIkvn7380rkNi3scYxA7ulZP5yxs5v7q0vDlCyuHdu+LzmZOAiK+hi5ck+yDjIjNzUlGDZ45fuHiyBMPJFYOAZkRZ0DNi3L/mZXl509v3H5kbk4KVSdkwAnvuVBUwMCboxFLBNjVOvb+9qGrZrgyzxakAMzc+D3K0Nc4IwhqkPWLG0/9f/7X/8P8Kycqqsgb46afoy89kV54sl58pfexz/cPPvLOM08wdY5ERNhscW551ErFIVgmdyd4F4cdGdVhLQ/OL22M2n2zwcmtw4rpWlJb6LVc1aHgxY32lYsbxn1ENUPONXNgka6HYRzUq7MX1y8s1jN7qq6LwfSOQ1CvwRfkDnfPWbE10WtmVxtikmieBW7a9HtFVfLb4Ox1Izdy5qStM2zxpZe/9hfNy8d7hoSQHKMgqwMMy2Zx6ZXnn/jq2ae/AcY77dvIKQEwqAiy5aXRUIWavIkJgcUdujVHKkQxISyvb9bZwMQdS3UiRnrtvlIDQeAuxAAvLm8Mk+SUCMbQSBRJSRv2HNm9XQ+w0Wi0trYG78i9BHsvhqIAIGOmnDMmvr9Xq/y4E2a3OqBdmOvH0Bm7xvdqKMbAUThvLtZP/T/5pW8EZCqJ9EzPuadlGiE2cjhWBy6djt/9y/KVJ/7eOMsNrxsFzgFqLTyJSNOagYR14iLUeVVOTmWCwjAxHu+EUa4k2NewejUCmNypA182R2OPMbAHQAhROAjBFZ5g2osmbN0NoZo6gwdVeg+GIpMVRLPTUxMJbSdz8u1987KxIJC3M326ad9cgLq74T0rcDI0KIK3tn7y+QGpSthUDkWvllXiVoIl5IZVabi0dPrs0tl32uenK10R7+QvKqay5AIwISd2Jid3hnf0wEiTBgxeUwK4mp/hmw7E1wHjBASCTnTHXFXbrBnIzkaBJTohORpFcqlbGNw8A87vvNmsaxEAroXwzPTUFc0Ld+ftvT6SGjMH+Nx0tXuhx9BrnsC8o1bBKs1qUY+HFy/0PffaUV/d2wqY1iGXHiVQk4fBRtPjTVlZfcNb8cZCqHnClJJUK1Mp6Kfa4QqYdO5aW64+BBCUTC1nosmEqnnGtcNttiy5QTaZRGdBtgQwB+EQnWPjlNyVRJ2SBpe+h6o2cCxYyKGg92IoupOB9++fq0IdrETcZSySN1tGDaMYSIKpkyOAA5ALadz7RX7w0MKeShlG5PEdidl4pzS3Rez3f+R/JlG3aFGtFg/KnRe2QSCh1kbKolWYxMYTSo1hStncisLBcHVRaaJtN07x2j/vMMDMsqaMDIV1PwHsiv2j/4PTzczU7YruV+d5aBN5PXf3Fm3Ca/7mZqaeM5JTKEDiPQvG0VppOa1YSaDoLmZMRuzc1Y3GbiD1wNSRv40ghMLfvKr63zuS3LX7HdkRkA3IQRprauQcKkLn6OjkRpYKWCRiMwY8gM2jj/tkZMm9AZioYxpZttSadgOgyaE37kq4FsQ3YmjaMSjuuGnh6RfWmlwXhUNC0GhmBjbP3SNP1ABWgAsf37R//tDBPcLS0TsceK8iqElzDCV6A5marjm0oVDnnNZbWSxKTlaMgBCnM4L3Zst9+95QR2vC1QJU1eAiQhy6/r947uhDEAaLgxRutoVPwNyMYMwMc88txwJbcgaYsGgcQLCiG3Lu4pkDg7gjZdyYxPh1UmMAiGTi6JRBIDIXoZAZHKaaOJ16m7Kda612niQOJo4AKcQSAhkHCiwAzLJb3ppbL96tt6KBXeKgF48e3jc9xTEaxarWsrRUugbPBVGvKEPkDmLtNetH9gweuvPQnvkId0CIwo163m/DGhBzaqcGxZ4770M5w3UzS4Z2PEhga81WAkaFbQbkHTt27J2f2Q6hyVYDJiJBAryT3UbK5ojgEqEERfVOh0aZjWGd9ygxO0dHAEeEEp0OppGbWCbVzscRzOae3WpwcklqSa9pYvkWbsV/APkwwG0schQrSQNQkgXL0iRsbg/yGAucXN3UkYwcREIsYsZm3bkEkcgiuHHw2LWAbXIKua7Q3L1/8JHb5hfiUNcvlJQ4Zkedc5M1uam32cdtyH5kZ/Whuw8e2d8nN8sKFxDoPSxLa5xctJqT+3/Obv74KJeaMk/v8Dw3pmmUs+DZxTx78eCD+pHfwN5HtlOXJGabpJYON4IKWwymRK2jdWQAxMIxgAOc4bDO65szqDFrgUxI4ATOzBBQIBZxQpPqTlHfIrkQmE3IwPnGwWlXElS+MpbfsWQVUCebDJESg4J52JaQyM4MuqKaKeQBFrkTm/dOacRcsrF5sBuH5F+DBDVJJI4p1xJw150316jsxfNrtW5CqOwFiexsqbWss1O9/bsXPnb74PBNsxFKniWUbnCz93Ao1oRQlIDLoXuOfPrzdVxcOvF9rzf7RT9aE8fKFGZ2Hdjz4Q/s/NBDCNt7EFBQzQ4SZkCpAw3dg49AERyBoIZsIOLA3XkPcxAhIDNneIbnGoPAIiC3bKoixExVUdTZRSIRZXd2Dgw4cvJrla+9WQ+Vjt7+WunrBoCJyw6sYWSQomgzGivT9juZTFLrTG5gJxBItRV3F+78cJlCEPiNxvCvQShGpEkC1Wzu7g8ee2DP3p3lyVMXXji/Vtett8qkUwXvXZg6etPc7Uf2TpcSGObeuWeqW5Bg791orOSyY1ZbeH939dHPjvftXvvet9KJp08srYhhqjfdv/Xonns/VD7wSNvbeyHRTXFbWIhIhLvyz52EKYDQoKwz1jZ9fWzL62llY7w5bNqs/ars96t+L073ZWEmzE+FviBQqgAgwzKpcYggToo2m5RFrQ7zMjAzyBWeY4TjRl0UNpmn7eZdibsfCW+2WTP1WipUMRz5ZjILFaX0hu8ixEYUi/5YcWnNikjsRRW5ECWCmztUGGQZ7giMG/T7XgsOKrGCEaIEGLwUuu2muYP75u4aYW21blIugszOVDumqV+gAMRbQhAKDku5YWYguL9nhWlb9BrEgcANypg9fMdD83v5vnsxvAwjxKn6wKFq50GXKcr1TdHd+2+YoG7l8epwhRgHAzbHWFxcPnPh8kunLl1eqxNKcHSwu7tlEVFtC9H9O6YP7Z2+5cCum/ftLMhBlhUUSqewuKknTy8urY4vryyKyK652cMH9x3cOzUQYW7JGlwjHyXf5l7cTvltS9OEbauVaI6U8zj3z5w9f2bp3NJGk0Yt1JfqaGOWbVxfHVmdRll/ePLMqdOnAc7mvbKIrLt3ze9f2LF/YXbXACKwPL6B7cZrgqAauRsCETw3Eqhy7RVxZ6E6Q+CBAZq9CMqeYC2kzDmLFCAWESYyy/Rudnq8+iq0BEDIWYNQj1Hk2Z00fVNiKLTnxFTA0RrYEb3dTuiVHGZ5Qm6SUBtePb95/MUzT59psnmyWSoWALgaeSJyZw2xzGI1MFz3F5fXfng23XakePRmnp2dQuxttDh9cf2J4+dePLOi1Gf0ARw/s/b0C5t3HVl44K4DB3b0RIob/mC8m/IhpJQ2R8M/f9pOn19db5JxiOZR28TSFlM9G71xoivGEIS4WtebI4P0W0VgzuDjl1d7xy4e3b/jg/cdObg7Rim2NKnenaEIRLnCcg8VXvOsix0HWIAYCBCQQCpMnO265KHoKu/3wiJXIU6chGcVWay7TVw8WAYzU+NITkKIylKAag2tAF6DrESVwZkKI4tw5AxmsOSJCxTYxiAmRAeP1uzZly4+8eL5S6O2RR8ghsMadDYHnTiWlXMQmAAAIABJREFUR81GAHU1I4dLG/WlZ46nleKRew7fvGfm0vnFv33q1Jk1JprxprFCnJWKNFZ76uSrQzSf/eAtu4t1xyz9+OTM1b2fyJoownBrayajWCoFA8hpuFm3OTlJzpbNiZmZp4vQr2IInWrJhLDlYHaCZuOiBUeCa1tr+OpTp55/2Zw6FMsSRKVHjr6OfFu1eBY4kgL9zOhoqAZPBEEYZT52ZiPbiZ/+2O17puINHNd4z95F75ylmUJ39ngAl2PDZoPV1fGwaRxF2S/nBsWuPhed4iJ0YhrC7E5uAIO704p7CoyAV86sPfv84isXRist2hiD/yMHhL/GCWbAnjg1bHjx8jCcOLV6arGuZToQ9fpVasFM8OiITbbTZ5dfmN+18+7+mz0nJQ7q1IwMc0XPgGHGhctpaWV0fLnZ2NgYj5uUc52yg2OMIqEX446Z3sJ8f2G22D9f7RxQnwFrTcQ1CSk1WWJJXLx8bvP46fZabVoG5dwGjq3zmUurL716aced+yPdMLrv+6F43ZcEZB27I4RyU/25ly6cPLdy9tJyO84pc4yyMF/ccWjhgaM3zw0cumYy7w4ihhsxpOtekENNWV6+sPa9H50+dbapc6ESYwi+DVzxD/I8BhnAGzz/1MvrZy6Ph+OmpV4sKs+1mjJNGdyNYUJhanV9+MKpy/ccuXn2TepgWLNRTJehoLUWr546e/LM8vnF8fLKMIfZpE5ELBGIRmQJ7mlka6uX/VXoVEX7d/aPHpi/ed/s3h0DddEURagqSFPTEl9YvrzxFmg726wS7CwknE3W6/rMhbVH7jpAZDdK9Ob9UHwbSp1gRhxlo8azLy5///mL51ZTS1NSiTKz8+rl8Zml8+tN74N379k5GES4dTZLE1K1GYzAtRTHTm9+5/j68XOeeaqaLlNSa6jiNw5FI7C/Bq2RG5wBFFFM6fLKqCiKXoi5rUVUtFXqgdwIDsRQuNvltfHaKM/23iRs058aenj65Hh5aenVc5c2M5wqneqFZEzeSZK7k5upm6lLUWYpQLKW9Ozp+tmLi0cO+W1HBo8e0KrirAlSUFG1NVbXsmsPyNfmuSSXwI1q4jIWM8MabUYImal4PxTfo6FoSYIr5MXz57///MuLGzHFgssC7UZEEaVEKDbWxj86cXoQ8mMPH5jUS53HQ2faQ6KQldXm6WdOnD6fYpxiG1OzMQCrQXlbQX4jx1absmsGkMPajUKIEdzJTAkQBJCZNw6EANWc1M3zuMmj1LxZcN/ren2cnvtRs7qx3phQWSVPrm0qBt20gLkTEbMQMQNR25RrdY6hkBi92Txz8tT6hfN8+85HHritlJA1FSIiSP/E+/9N444TUmE3eXujmOLvey9f/wSVo6FYbfDi6Y0Ly5x5BzDVjHOi0kLcrNuRRprZfyn1n35l5fR6N0/HW3i+OjhD1ht889mlly/bCIXHPqTvXlqIXMWrtQ+6d/mxH1EhnLJlDo3BWbgsa6OWexJcNTkyC5kpMxO/lQGRBnNDH1xuaEhlqqbbMKUyFfu7pU0h5Zi1VCvVpGkxGtF4nFUhExdNNScuDdWwCV99ZvUbT10atqhEKG2WnOdmC5ZrF40B6laEEF2tXe+XHgVXmSh6PxTfA9eignxtPDy7slqzNJYjN4OiLs2nyPvUctpgHzPy+vrq8vKyul0RC2YQKIwNz720eOyVMxlUhIh6s7SmK6Da9E97gk5XZgcZAo7OkYsSgpTqbIliwRQAdutsrDiyBApkbzoapwotgwdo7NCqVIdUy3hNuGIq4dEtMAIjBC7K2IMROxgqZBwD9QZNmF7P1SiUf3fsxR++eKYBM4dIcmhhb//a3VktubpZVsr1oMgH9swQ7Ab2t98Pxeu/MhFoWOvyRhOreaaSQd6MFWVTG1OIUbKZS6jNFldWuntMTQEndoMvraannjuxgTQ2yd4H9bLnxJrjTAr7/ikp2OubZanJhYScs1sSNAHNVAFLm6k1phgokAcoXGHZNb1pOvhYNxqrE8Vs/TpFR68IkZASUqImc+tRXUypTV5nNEaVUyASIFsatfUGrC2KQD5YG9JzLy2eXhpnKUHp4J7i8O5rt2OZQihgHqH7d80cuWkh8D/Sp3k/FN/lK7oBeSOrz8A3nIemOYc5J2PxWqhBv7TkaLPsajbcIA51V3jUzAr60csXT68OTKeZmXkTPHYu3XvRU6EXxGpxh4si/v/svfuXZNd1Hvbtvc8591ZVv3u6e57AzAADYAYkAYIgTYrSMhXSspwojmIrspbsJHZ+cuz8EfovIq/lxEnWsn9wIq9YFmVJpCRS0YMUSQAECJJ4DQbAzGBmel79qqp7z9l754db3RiS07BJDoAeovbq1ehuVNVU3XO/sx9n7+9rnEjE2pKykw4rVjZl9STJKSqo4wFX1UgQItcEnzWPhKEGisWKo2FNlN3QcJUC8u4QZNdU/Z8MWtUWKMwqMvlGja3aG3Iq6CsRF65LkhzGxTJzCCEUZ8owdXcggCJzIIZaW3CbQv/Kevr+6+sZBB+vzsZfeOqBM0cWBtR6aQwUoXUekraj/bVxCCVLaFNyVkYjBDISp4oTgIidU2vVpz7y0Pxs7URA/qBuk2nZ5sAZEdxpwhcc4vrt8ZX1zQzjfU6fyXvFFEF7gbUpVSl1b9TvYRDrGHjU6HA03h5voxAksVQjBxGzm1khMCBusHuXI82FdtxsS2AO0ZTNrFgBrE49H2UhZyFlqJs7vYsvIEhIcTxsz7/19tXTayeXKjiOri78l5+eeeNiuHhjc32r1WEberyRJY/3bQgPFtWp5HEvNLO1uRciqgM7NleXlo6vPnRibfHooRQBK2OHUYhTKE6tg6KSCTOKqbKcf+vW5fUt433FX9qgFFPbZB2NFiKdOb526tSh5UP9fh9mUPVR6xevbrxyYf3yjdHWuGEInIyZvAWUQO6Me1fBz2UkISnLUEk4VlW0vBNYc27cjElyMQssvUFubdRqT+7uZ3PWEAJSfX1zY/3W+MGl2dK2sUqrC7Ywu3SWjo6dNftoqM+cv37tpev7nXG4UgjUi/Hpx45+9KEV5pbhAblfx6qqdhVtzTQLESR9UOs+heLBq/JA4QynYrZd5NVLt7ZG4F7Yj/+HSwlI0ejYoeqTjyw+9uDC3KBWQKyZuLoePzS/ePbw3HdfvfrMCy/d8LniSiRMTKbohhPuXcNXQCmahXp9Zi2bQXMfw8VBrz+oyARKNzd3tnLO48pK7KdZ1/aur1PFXrESYzVs45vXNp44PR9EAOdMgVKfWRks1KbwVi9Wnst+H4HdyUo77AU7skiCCM9iXAisjZM4MyAklQLm+KC4XaZQPHBmhkgEuIdwfb19+8bYQ/1uXjQtj5qdw4u9j5xbPfvQ3ECKw4sCXLEDaN2N2Vfm5PFHj7LY1757dWOYjdlF4No11xGi36M0aVQt5qwwT1Rme+HcySMPHVs4vDwIkpliVty41bx55fr33rh+8WarVDPuDsVAYeyj1pOSXLs52h6XpToA5hzJ0WmCOVpBslI0G/ZhcSuinCI1oI5GxDRwBAsoOMAO6k4UJzqQH9i6T6F48KDoQqxEDg+X17d3Gg2hlzXvd5f48NZc3H764RNPn+nPULEmM1d1d3hhheDMVsoWIKuDevbxtSs3tl59a2ezqIt0BDfkAOxekcyNtrfmB30bbq7OyVOPHH7q7LGZqIEKbAvSA6oj/er08uEjc+mbL1177cpVi3fvrMtNGwKyteDUZDStoXKHj6WVTr6MwDAHXISk7pgh7xLAe45egcAT2VU2Zy/METAQd4w5hcmJWXb1GKdQnBrgAmoBbXO4em1DiQn2LvovoZp7YG3+0QdP9IizFqr6BAAZHpkDLMAg1OvkonK2j51ZvXXrra1bUBdyEWKCuxbcI6rSVPVcSy3+kYePPnHu6EyClYJQQeYUoSklkg3q8NjplYZ7V26/sLUPFUYicYF6NrPhTpuzGYhIKlcGTTREzIQsZovZmn3u5VoqN6LiMONOPrIrBwNO7uog62alP9hlnx5mHDwkEhwZsLaxjc0hEbnluP9KOd46vpqOzgcxFTgBpYA8ghpDW5CdYYRGoUDqxYdPLM/P1EJMiJ0uE1NH6HhvbMDKo42Th/pPP3Z0Nih0JwUp6rmwOlIIUeB5sy/lkQdmzp4+tO+tSaRlLEIxxq7ljbmj1UhANAuOUJwVXth1fyB5digSxUhC6sVGQCFW9QJyMDmLk5iH1qTxabfNh9QKfC/DkU68MYq7wtG70eLmuHFXCdTSREfdAAM5EZETCryZi6tnT80XReHIEsUQAmCFUDFS4EiAMCqBAAEww+OPHunxhtgOS9WCnCDuQeFMAmJzIxBR+IlaT7YLxSo89tCxmYjEBEqdOnoIHAkCA2BSAWE+4skTK4u0QyW4iNKYwOoo1AinVlqigZdYMpzSdm4MWTrNaHcJRaFBeuIiGJe4/53MZJRVqKXWmSIPACPqwgEQdbzmxmSJvfrgfOMUigewgtpxq3POaupEAn83NfL5ucGglwIBfgdP4f7KTRVjplf168AT5v17TK9IpFUKg5keM9ydJ4PMk1TXdgU2urc6GPT6g/pORqlux1HVD9u6T6F48KDoRCwKNE0uxQjie9ITd7PlhZl+FYSNAbgaoO8qVhlg84N6tldTx1ZM5B3Z/Q8GyZMa0o/vFwVaJZqbrUXQvT4m09DdXkHoqJ+sABjMVINBr5N3ICJyJqI7kfke3/x3/ZpCcWodDIwAdkczzqpOJG7w/bnT+ylEIri6T1yKO71LWzN56SVUScj0zqpj94w97P3EfdECF9I6dd2cRkRu1h0YdCIaAIMIZAZj8SoKrLgb+0TR9U7a0qlXnNoHb6rqEzFRf5eVYmaCdQgG/WfQW1sRwa70nmNXJvFevW1hhjmTdzjcfefW/VvdyCLeIchxQM30HYU47zykT6E4tQNhRGBmm9zF/i4ZnRs59hzJbmL2Lojk4A5zInAna28TqEw8oeOncoxkPIEUnEgm8IN2HpccZnADYaKCCjKQCXHnz9nZfoZ1xaZQvJ+WhOFQAkLkTlvl3U8aRlkLeEJu3Tkcf9cTe+JxQVuKUUdm5XuSbHeUjn74hx8Lit0AbsezbwYQGYzIu/yQiHYLUcRgImdmkHVK4rsx9tQrTu2Dd4jo3EKnV7l7X+57a47bnIsBnQvlLrLrhGvu7kXBbbYmq/qdTviHPeBPzAfajZUQuEtZzX0PWt3nYuLdzwWb1HUmqsBEJN3Hpmmu+JPkNF3pOQPFHGooxYCCkicSYa5mNimbZ1iGWgOMso0ccEPJDfZXAvqZttCdJU6uows6CTJElHa+yin4CJXHSrA5SbEAhncVR0cAVTvrb+8MhYikFCdpKBMZCrs1ZiV3oaGjlAKYIaM0O2Na30GhULGltlDrLtGZxGCdTq2B1RUefvzySRFVKDkCCzNEyB2C2l0kpD06AXfwhPRbTEgLJ6o1aFPGDDEyOLFp5hCttCwpawF5F4JzR6nPQHEiRS33iHvqA70VfmorhhDFYWaFyIQDmEuxEKRo66SBmQgOApiY2QQc1XKgRI5cPKZKC8m0Ca9zR47OJaYUhUEwL86SdB+/eNNwZXu4MBerblbBLZdxkgDqEcG9EJxJiTsB+2gcL19eN3UWVrMYRJyLG334ipY/a15RYgZMCwlFJu7UnkMI7kxSEw02d6qtUXDUBdxqC9aSs3BFRCCwwA3ywc2JHcD4tAvPBr1qrl9FM3Jg/9HeW8Ny/vK1UZtZCGDhKsYehG2ipMvF4RCwKLgQNjPOX7xmCGDJpkpM8iGtlPyseUWgMU9BEoDS5pACwLdvj5977voL33n1zTdvjke6uDR7+uHVc48f+9hH15wdZO6acw4hiXDblpSmPvHOtI20aC+mw4tzF9c3nCpH2q+IyhQvX7y9fnR+8chi07QSEkIwl8q2nWJNARBoAZRYcykvX6TL17dBM2YGEjWnAHcFyfTi399QdCTTzrlZSFENf/3Xr/3xl7/+R3/8tatXNxz9GPq5jDiMT59e+MxnnvgHf+9XHjqzDGQW7c6WYqRctmOYma7HHWGqp4Ajy7Os10ii7k/PWciv3mhfe33nyMLiXD9NGHuJIR3di7ijmISYCnBrrM+9fGmYxRNcSwihZA/uIgKfXvX73St6CgG5DGMQR/XVP3vxX/7L//jNZ84zBm6HYqqLm4Gg8bVXmktvPfvG+Y1f+/Vf/PnPPjaoUyklcCL2GKaJyl75xiDCzE66stifq/xGLgbZz2dppKGm586vcyyfeHx1aRDZW5SMsGAwoDC5xNACb67nZ1+4cOHK0CSRA65E0p03CJlh6hXvdygaIAghqMrX//ql//1f/ce/+uaFmFag2UUbHasXZiauTNNwB1/9iwuKv5ybXfjMp06IOKAlawhpWjW484oys6EsL/SOHV7avLydifehgIEwXMLV7eHXX7o8Jjx+6vjq/KAXIeoi7GCHDxu9uD58/uVLL7x0sa1XI4vDojjcmSOZTqbZp3ZfQ5El55JjqDc38Pu/982//KuXUn912DYDzh1TgVAkoqLGECJyn/nKn7wwN0gnjv6D48f60BJCpY1LPV2OLvcTczCZa5mpq6NHll5Z3yGn/Y4WQztWS/35xZHu/NXz1159Iz94ePHwWjWzkIJU45Ftbo2vrG+8eun6+lh94aG+NZodmkPFrZUQeqRMnqd1m/seiqUQCSv4K3/26pe/8g2RWS+ayNQZeyVa78amzRnAOKX6T7/y/Mc+/sA//M3Px2ACSHXf78lkRIBRSW5KzM7esYbSj1Zl3s2Sm5pZiM6xAs6tpRdSu9H0hUoBCrOVHMgqDlpgXMGF2do8IgcJr+/cvPHqdbyKVXGFZ6PGqXUuLBUHzzukBEBJVEUAlAyirMFj61bTnQw3Hn0f4pn3wrpeub2r5Oa7Ux1Ek+8/ycH/ZKzlwGfC9+AwIwQWCltb5ZlvvbC5sQMQM79L41XX6Tsalj/4g69ceONml6KYTosGe9Gp3wFXW5gbnDl5LPpIvFjJAZ6CsKlbK+yuIyPrOmOc4MRwMQpG4bqGWxo3PTYelSI8CCiAIHB2kJsryB2to01V149NdwJjuhb3GRS7uYH19Y1nnn2xLUyIZtZ1G979VrMiIhJ63/n2my889zo8AeAwXfi9vUqIiOCBANdezY+fOX58MYqV1FFKFA2BA5NaE7uR4Y4ADexgo+Ae3eMm9bapHlLVSFUoOjGMYK5QZ6dAzu6e3bWUtpT2P9NpT+3gQhGuan71ys1r1zZjGhhYVUPYN/Q112zK6JnPfOOvXxmP4e5uZboYk8vJcAJstyHOy+EFevKhFWFjFDMzoEBas+JQhpN1/dwGGMQgDnGIcGROzIEgewBzdzfS4rt/5BBSCGnajfyzAEVidqMr1242Y4NzN/0pYd9XjlFUtcnOPPPyy29tbQ2dPowECvvm3gCRT7QpiDTnBD93cvXRU0eq4EKW6r4aZUTuDVr/US/GRmzEteZkOZkGV4YTOdg9oAqJnaAuHtzYlJgi/UjVYOoe70OvCLj7cDhWeDYFO5GXrO9S3hChkGIusrXT3N7cJLhInC5GZ9pNuzuKFkcQDl6apR595skTDx+bq6ix8TaDQohucHB3XrG7kD7xjrDoJVgRL/A9fRgA8HacQFAlhxCXYqVYMb5bVk9TQN5PUDRVZqnrPpjAu8Nv+/c05lwmz3PLWkbjobkRTRvf9hDQBZvOFIoDIQoowB6Yw9OPrD16bL5PbdQxl6xNQ6bkTM7ke9wsDlKQZomFg1LwzuOZuxoVExsfXp2ZGwToUNglgAJJoDvrNHsgnELxvgpQiUQwMztLRO6qmh0W475erutWzaUJgXPOEnlarPshJJqbu4NRFO6MjlG/vfHIsfnPPvXYQydWIgprUwtqZtplnyDv/GFhN3YbQVqOhcSYQUEoBFAAHV1bePzs6WOHl4BWfcykjqLaTjLJ6Vrcz1BMw9H2iaOHVuZnpZ3vxSRwt9i9uLubq7k6iqOA1DgW9cDCnufqmR7NBYrw5sBBYkLMIuQMEhCZaWCLJSdVoto01u0o5BGkHiE27hANHpswaF0hTuZjakwhKKkuKW+5BadxQVvlihEdKZiR7Yykgsy4bZV+7LkzInElQC+ACA5xBI8LAI4u4hefOvE3njg+M6Ch5YbFqHUyYgEl80qtb94DDaLmAAc4O1OQ4o37zokjs5//+LGzJ7Tdvkw+41YrghsLaSjVWHbYrUfWuCq0Crc9zCa4wjMMHoqGng8LKACuJsSdgdmJwKzuRasQKaRWyxjO6MZ2yLpdhrF7SEggeE8gxCFnEI2ZQTkxAWlsVhf3wJZbldmEDR1AtYGLo/g7LFpqKKkKUArggI7i3FxQxIdWspClQhbFOKW6UYPDcvgAdRT3dVE//UvkPOz3qpW1cOT44PK1W6pwdqIRLGCPPYF8995G0R2QmWdCs7Q8WFgemBv7AQ2E9miR9sK2cVV2pG2jMYw4uHt2izFJO7Z2HEI0L/2AAIJyjIkBgyaJdewPLZKw6Y70lMxKUXEPLGwSC/ULH+sv7J+RF3ipOR5biCufOPHw8cMvvPzma29eHnNs87hksKQoUcnNDIogAm8Yqu12XcqRhfqRB9fOnXlwMBO2FIYQJBYq5lkQuw7UjvrJzLph+sgIzEULSRQizaVK4dDS7MXbt7TEGMVMc3Z3Z2YWYnKQilivEnJICK5whoiYFuK732yLS4dw/pYZU2IvxVTdSy+SAkU1pb4UDOpekh5zN53CRKzqLAQnM5vpJ0Eee8MUmIIpXFWY+5AI2sleAfDcq6QObMWJyHHg+vzuARRj6AE0Nxc//okz3/jWSyGtjJoxkYXdZptdVutJx0PdC6UUKMHGjzx2bDATiPkgq3dM2B+6UJx4bXCoZ5ctg1S8UArCJWPYylzKwx0hiI4H/VSnSBJcJ2s+Pze3OD9z9XLDIZrQVt50rpiZpFYv6jly25tpB3P7V5JZCO6W2azm+OhqPDZ7cvORtb96G7dvbdzY2Bw2bS7mqhRJRBgBpgtzs2vLR44uDx5cnV2e5YqRGG/f2t7ZKuMinojgBEpSm3XkcWLqxMLOMVAVI8gYgIFh/RrLi3VAIUnjZkdSTL1gZmbW8SEzYrSdlaVDMTDAXdRF5O/SJzM3aGd6uc2NqpBRkspNczseAYgUYDoeH1qZna/rQC3EupvKzFikY6VcnOsvzvKlYV/dIxOCkVlkcTVrtOpV1OSFmbg4kwSFCKBg4J9BKIJHbdYq9T7/Sx/98lf+/MLrTUrJufFW7+De22Pgw3hUqliZ+WAufuazT8bUXVnwgT/ZEpATHZlf6PPlkY5jSqUgW66ThGA3dvJsNeNgtnxkeaVXRQBMcIdpuzjTe/jk8lvrb+20qOuZQuNkDiUyD8JNO4piJ9bmTh5Z+NFiSeeZG+PALGzEBndAZ3o825/5b9cwbma2RyvD0XiYm5yzAxK44phSXFiY61UgQ8UGZOS2pbS12Y5ayloiC9RKbijMAIWI4HADMdysl6peBHEE4AZmZtjxlcHhxd6VW22dega10mTLQh4lIasZlmf9zAOHKxEtWULqkhSi4HfrPSOiR44denXp7c2LQ5O+cGjNCUCkSubVxlTGCz2cfWh1toKpdl3xd1DakTAvz8ojJw7d+O6oaUZIJGLqORcwJEjQtqnhjzx4/NB8z6wVnrylg+YW78lkRq8bcTpz+tQXPvc3/8X3vqxeS+qBhg7eZfDjPSZMRhKIo/nkU2ef+MhDgcwOJJmDu/9o/VCITh+ZPbW2sPXWphEQ6iabGScrIdShku2Nmyuz/OhDR+uaNReODCd4iWgePTl3eX3ue2/ebEcauNqiUV33vDih5SBra8uPnHlA5O67NRFVRO5wB3FwMocXL+6IhkEV+1WyhWS+1zdnsnu44XBnKmACc4wErF8fZmOuYuevdsun7u4G7vI6szw3M9tLsG6m2ODCgB0/PP+xR47tPPPWluSmNZYkMoCrliKUB4PwkYePHFutGdYxszrUzfhu4ocEcvigljMnH14fvn1tp8kUi7GLFi/zbbF2e66Pc6dXzp6aDbCCrrMPgE02bhLAeoKzD629fevy21e2dlojGYQ0MLNiWQlVs3Py6Oqjp5dnKkZxyDuskAdro/+t3/qtn/aWpUzkqk2daGV19datzYsX33IfTXJz79J1n9wY5JFkNNo4cXT2n/3zX33kkUPCKswEIzpYbtEJ3Q7R5YqT4j6oqlpJvLF1Y2vzJhFRqoUluAuZle25iKfOHX3iocW+FGICkZMLEXnp1Wl2fgD1ZmeEpqFUohm1m/Nh6/SafPrsoSceHCS/CerfPU7OeVd5QkG+V/wQn/zqpuQWmQQq8JKbIESugVzg0Elnzq1Mf/XcpStbOfSimbJbSpV5x6qv7iTE7iWyPX567fSR2uFiIBgFKa41h8W5QWTe2LrozU5UksLctj0eHl7EuYeXnn705GwkchUJRGRehIM78d02GQJFu35sedCX0g5vtFs3Uik9WG251nZxVs49vPLxR48cmolexiHEbAwmdiNCwYSuB+aDQRpUW2LbeTQuDdC6a8M27KX2yZMrT3/05NHFqifGHMy7y3bg7rd74BUJyQ1wEPihU0u/+Rufv3XzxrPPvNxytykzOo7riQKSQzceONH/1V/9uZ//7MNVgqlCgqPQwR5d7ZykA42FY8dXPuXzve++/ua17a1GzTSQ9fj2zGx17uHTT390ZZ6hZRjCXHZT94oSqSTRU8vV7NMnTqz1b17fubxDpfHZauXUA7Mnj84uDTrNi2rfE9YAELlZpzPIzOyu2glHAaDdNgmDuVtJsT8p9tBupgnOWV97c+v67RYSi7cwp8IZORsqIiNyBzHIvVfF1ZWFgDYjOTIYBoEH2Hixrj/1sbW5B9YuXb5561Y7HFqV4upgfALsAAAey0lEQVRyfXStPn44LgJuDRERhd0w0Gj/Wn0DFokPP3Zkdm31wqVb16+3Gxuj2IvHF3z50PyJowsLNdhaOAHBYAxy79jEhZyhhaEJfOzEA/XCsZXj7ZtXhlvbjTPm59LyUv/jh9OhuUDWmIKl6uJbdz1o9xv99OdIBmcQPOcyjDE5es8+c+Xf/Osv/t4ff9sdbhEuu1BUwI6tyq/92t/5H/77LwxmNoSim5hGiS1wsAYWJ59r97RtwiQPEDZbDSL97e3m/KVrlzfGzWinorw4f/jQ2tKRlcGsNCgKUcesEgzwMaoAlJxD46EuCK2BtBWkOqKUHNiEq5w9hn0P1UfwLl+l7lTAupoYnMwnxOAEB8wIBgY0dMzfxCgOJRCwPS7//o+//+plbevU2Gafe2zc6oirQShunLNSFIE3y3P1b/ytxx8YbLeYSchwH1uKAs5jYneJ5KFtzZib3MYg/STII1j2WDsKczSLROjGrBh3GQ33yS1YtGFJbOylFAlxezv3+qEFBYYD0TQAgGRVikIAWwvAOAEQbUFmRDTOVNegMMrFnBITu0lgJSYfMSlQqwV1RAEhf1Dqwu8lFK3s6h9Mdr6mycPh8Hf/w7U/++rXXnn5wsatoarGxAuLMx/56KO//vcfeeoTH+0P2KlloqIa7q+pYfMufDV0Z+pdToTevdtliymTMMHzGMLKaWOIG5evbm0PKcjcwuyhlcWZCuStkBkqMxMnYgbgZiADuzkJBSgAVx0iVUMLzz3/1u89dxWAU9ctx9ZFtwCVIcVEnHKTK2k+cWblb3/69BwXmkpT3y9QnMgtuKv65MAXKMUQ+PLbN65euXHp4pXhcLy4NHv06Nqp0w9Gk14fag4UETID83212LtnUjYZTeo0LZDuUUNvx4NIzFpKCKEAL725+fxLb37nhrWNuaISPrw8eOzkyqljM6uLPDtJE2BmTujGlRUgmBh7k0PFznQj8/Ov3/rLZ17bGgNgJ+xCsVMPRTIoZZcULfSw9St/88xHHlhIHXPw1O4jKKITBrxz9hSNwwlBzQEIk7kRgZFU3azEGAHrnqWqIvcZzZH/cM5879yu00TdieX82+OvfuvlC1c3ttKMKSqJ0SFleyaM1xbDiSMLjxw/vjDXn+knhrnn7gDJ3JgKeQAFBV/dap555eK3z1+/vmmJKyfAu66Kjt6fnBBLKJLBHFt7ZCX+2t9+bK5SaJiyT903ZZu9AuMPDMW5k0e4m3sIEYDrrteQAnjXpKraRVV7El/3DQLpDuxNtrN71Dnt7gR2LyLx+o5/63uXXrq0TTNL0iAQMchcjfubWm9f09evjr51/sKRw8snjy2tztezvdSLFKWr3XBr4ca2v3zp2oW3b61vjLZHMfb63ox3dxG+Y0uGkiIks8I+OvvwsdmETvBpavdPBZXE3c3e0cTrYKkFe9z7ZgDtRTou0sVTYGairtPKcZ9uv7bbs0f36vWKkBCRwt94+/obb29amDOkQdpRt1zMiFmicu1OJdtwM9/evn7+/OU6NLM1z9WprmJg2djeGRsaCze28jhzSnXPQePtzD9AxN4JUMHJgpoFlHLiRO/MqQVygETZZDpVfL9A8YfK/Xu+sTvUnYgH7Tq9UgxUiJiJ9o59zexdpv4PXEz/Q7/zJMi/V/5DWKwoCxn8yvqN21vjen55o7mdS+MUhVLivhXLpYmRenXIOpe1qDdj7W8MHcMuaTQKh8ajzSqScEVBskclJzGayMD8aKbSeFvmavvE2VOzPYOLuhTKUyjeT1D8UYYid2XWO0CoahlACAJUdz5XVe+j6PTOss2dn/8e/wtOcHKCgd0FWhLnkqoYK82edSSgWBNL2RluCnoM4t2j7wIzMDF7RkpJqCVt2EMUztBShsa9d5rv9wIZRyhltuInHlo7szafoIAwMU/Lp/dXrtjhcM8BEjkR7/7GnZCfSDQrXVC6+yxz74JVzjm/y4jjgUWj31G5ulfhtbmJBCc3+NzC/GCQN0fbqVYrM+7q1kY2IjcFEIMMKAZ3L2rUCRqyB4IhixORFyaXGtYb5ywoKaEtMAJP2p8I5B0ee5SOL8989okH5tjIDZqJK8FUYOp+yhV3I9J3nBvf+avI3gPCDz7rHVd6P+GQ7vLjPUxzmVLbjlIVaudTh2a+P39545pmWmHZNs1wJSdxgRMKIofWx90ImsFBCMTu5gqIuRMVJqj7VmQCoFolbttsHPoFZF4oMAq5y0dW9NMff7DfgxDDq0mjFOzHHWpVa4iIabfrere1AxC3yRCoqxERCeA+lc2597ni1O6Vx01VZdoa9PDK4PSJtbdvv7Hd3CaqgiQRUrfWi8EUDpQq97vRDfJJQxwAJ7dSADDt0b2Zmbl7GyuuyADOGpx4OKrD+Oja3Cc/dubo4V4kODIhdr1q9ONT+QrLXjEIToDAhbrxG+9yFqIg76qkPIXi1A6AZfPAzsyacxCcO324zfbiaxc3GnUL2UQpOAlRiKxEIFMAxBMyDHO4q7szOUi6gQszA5OIiEjJWgxwgbE4qignjq0++bFTJ5ZjTVAbEbPQxFf9BOGpdjtC92QyuLq7mxNXRLzXEGJwOJtZDNOy0G7hbHoVDpS1DtNcB8A9q1Lo7WS8+P2Lf/HKte3tdtSSS82SrGTTEtiaFHbLZtZlf5OmC4t7Q88TNAJONCB3FxTnMlzu54+dXn7izNG15XmQOcygDAGCGYQnHvLH9eoACObu8G6b6LqTorsRd9JVNvmbg6maLvoUigfRCuBukaybNHQISNqCb1/FhbeuvX7xyu1hcY4Gdii7oZ1grOPa2yuOsscuImVmEWGeANJFSpt7ESePzX/0oUOPHJ9bCLCxSaLJ04nM4NDABOiP2zZtcALRrveDkXf9eAz33WZ2R3ffuYOnkdkUigcVihNuJmInkBvMTEIAdDzWyze2Xr10/fVLt65vjMeZnALiipmpT4BEECcQkWlmhhCbFy/FvDBIRNZo8+jxheMnFh48vrI80/MMslwlMe2GqbphFGXGbs/Gj40Vd3fk3eZWAOxwgjZZ4ZRCj4jNXAhgnxKTT6F4QM2sdKXmO84vzVQVyhIUYQRsDnH1tl6+ur1+c+fq5k5btG3boq5OADmYiByFydnNNAv7wsxg7dDy4tLCgwM6dqzuVxC3ilgAuJbShtibxJdku2UemOHH7r4wuJtBSZggrWJnJ4/H+crNtwDqV7OLc/Nzs706OdCojwItTRd9CsWDaG6FmM3YgS6oc1MRgjPcHS2xOqCIBdEc28NmOBzf3tze3t4Zjppxa20u7h5CSDH0qjjXr2b79cJMb25m0KsDkOGwbBwYKMWNZNA6ElpM+JCdmQAyl7vP3v8nPkALCm48HOLixdFzz77xta999+WXL26Ox6rK5IeWZp742KnPfe7JJ548sbiAKenxfQPF/d7fdAX3csuuUKPwyXmFuxM6SXUBMbqJd+J7es3adpxSXUrpJuO6G0lz4TQCBlfX23//u//fl77059/7/puqPXjlRGaILI5GpF1aks9/4VP/5H/6jSNrNbRJQeAhqyGUCIYyhKdQnELxvvKiuz/o7q++FykCtHu0QPfa/ZgZM+9+L8zcNLmqKgf+4s9f/Z1/95df+tIzbRYSdncRGRdNIbqT5TZGbcvG4kL6zM89/c//l7/36OklK2PhSkFgE3QUHDSF4tTuKyjewYJ1Jzi7hI/fy52rwyFgDgXEjNXxl3/xvd/+7X/7nReuq866REfLoqPRTkyzWpyZGRIYuYxyO5qbm/mH/+gX/tk//a9nei0xqzOI2Z2MPmxzkvdDDGB+96+p3eH9/A4jczIXQHbnKmkXtPd255109kABZFdnPPvsa//it7/0zLcuD0dUyJuyM25HTesisyxq3pg3ilGrY4mx6s+2GV/8D197/ttvEoeOCoK6KZcP3/LeD1BkuvvX1Cb+jkB+59xTpz6/lzbu2Xvkk83MAaF46XLzf//Ol7/5rdchs73ZefVGQun1Q0dAmXOOSVjgUBY31zY3xfXq9Z2vff2F3JKbMYi6SJqnUJza/ZcrdkCkjjT7na8fQOs7dm8DVHIIizup4StffeZP/vTbEoMWz1lFghlKaYXdMRZUXoQ9Re7BI5xiSMKBJL743ZdGQ3MLzKyWzcqHsBJwH3Q62D7BCk8LNz+MyTsulO8DvHun2+Jda1vnwpzfurjzR1/6+u1bxKBYzbTZ3YkleMlGFCgyWZtbIzBzzpmCpBRKaYH2xq3b4zHmZgWA+Rhg/vDpbd4XUJw69HcPbOgHSzh7Y8E/oJfUjW5MAtp7ZCKCrt8bePXV17/z/CupWrSyAyb1JqVInEtuhBK5qZYqJVUDUa9XmVnRhpgMhZnbVk0FZFGEwK4futmpAwTFAqCUwAEZLY09AahHY2xsb9za2NraHhlh0Kvn+tWh+cHcTM+sGwjK7i1RBQ/FXKQlfHjbi98l/iS6x0PABMsNYhyRsJfei8/faltp/EagGS2WQoTBLQpFB5SgYDBy1iqEUgxACr1SWuZBXdezixGh02CsOkmqqVf8wEzVquDIO86RY31jnF9/4+qlizvfvrzpYAOrw8pOL/Hq0tzq0uJTpwdHVjkgmoYkRGQuVryK07j1/bKY2MGu1DTtGxfealujmN7FhZoqCyG4FzOzZjyKKQjpgw8eY7mT3sHNPnTS4wcIikIOtEZjCr31HXzre1dffv3WrdtWYgV0ur8AyXBc3rq88faVW1fezI+cWn38oSNHlmq27GU7xjSdwHz/ohgvgQIhOJGBb9++nWLfpDIb3z3RKBZTKKVt8pgppDqxgsh7yZ9++iMp0Z3SXR/C7OMA3biBpZQcQr2Z+ZkX3/7mS1c3G5IwMN+aMOcaE7uwO3l2u7AjV1/cWN8Kn/zo6omVVPE8ObtDpl7x/clRidUg3MnUaFVHdy3NvjqZgUIpxQkp1OOm2DiLkKGceXjt6Y+fSwEllxgjyEspQdIUih+YuYJQKXqvvrn9nfM3NjNbJerjJBUzK9wMZgVOTg5CFet2p33l/CXk9fTxB06uLnkeCRO4nuLk/Viv3dTTDZHpgQcOqQ6F+/sdXzKHNrcSxZxFqsBSynavol/+5U8fPVoRTETMJi2zH8LrebDCOQ69W2N89/zVm9uKuiaMYa2PqgIFwESxk+wzLcU3SWLdK8ovvt2it4lq/th8L057U9+33N4tMhzOjF6fHz17YjDrOzvjfQPaUlJKTj4cDvu9OUErPPr85z7zy7/06SBQa4VTLibsIvIhrKAeoJicGAasbwwv37iVydULuScIxzqknsQaHLMiK4zqUM3NRetLluCNhZdfX3/5/FUHSNspSN7XVQPBQchnHzv6xBOn3Lf2feSE3UNTErMh+eYnPnHiH/+Pnz96pA+0TA5gb8LjwxjwH5y3YmiL604z2smNCdy94prbSDQiHzJGgUcx5hBawrbbtul2KTzKgfqDTQsvvbF55UYuPIXi+2RCUbUjxnCgfeyxo1/4ws8tL83s+3ihph3n3KSKYcOnnnrkf/6nv/7Ux4+bKpMRoWmajvXD3WnabfMB2thTj+HbmyOrSJKoabPp9Tws763mnf0kDVd98yqMfKzziFdvbj57YfPBpeU7C3HvJDZ3++PUfqpd3N0oG8BczCoh/Orf+YXhzWv/17/5+tX1TZFZ515uVRLBx6A2O6q6zqPhbMIv/Ve/+Gt//xfOPb4GjER6HY9sVQFA4Nh52ykUPzCrGKVYipWZcQhOHik1ZLRvGYC9uBs4BBS06uu3Njd2ZuYGaYqT9weMTAFkHaOcFp+Zpd/4zV+t55b/8A+/+sILF8ZtiqkPsGkboxTbnJ/tnfvUyS/8rU/+F597em21L7CDJv07hWK3y6qDZmbmGKRa1Di7GqnsH9FOtATB2dW5unZr49bO8hSK74+5EyAELqXEGEWg6nPz8o9+83NPP/Wx5557/bnnXnnj9WtNaynGmZmZh88sP/X02Sc+dnJpRaKAYWZMYJp2MB40KJpmkXqm31ua6a9vtxxqzYb9ieLNjDiCKRcTJenV2+Od7SZPF/X9gmJH9S0icXeGuKgqkZ09O3vu7Cf+7n/z5GiYzQxkVRUHdRVi1wBbCG5u5hYkTB3jgYOiSDDHoJaTRxc2vveG1TVTPVbb340SgG7YuyP/NLOOeHdq70cUI2aKrhNYdU83WuBsRYvroJbZvgBWtBUhYEwQcy/ZRKKIsJjDphn85HoeoPdCrKr9hMdOrsxXrbfbRO+2Usysqh1vihA0N1WQSqbhzvsVxRQVIdUMQISIRNVVvc0tB4lR3HPOTSlFKBACvAIiU0qpJpKSueTgOs0mDh4UzbqB9HJiJZ09tVxxsebddDadpLgRO8ECA1qW52bm6inr+/tkWggeQkjurqpEExrymIJ6MSsiFGMMITmCFlYvxRpF4xgTtyHmEI1lGsUcSK/IgS0P+8mfPPfwyuK8u09K23fPVSbjsaoZbpF8eX5utj/dZd8nS1Wlxax0p0RG5O5qVtyZKRCzwc0LYMwgBnEEV+QVUJsl92nj/kGFojsEAPdi0dWF3s+dO3Z0pUe+LcTkYIZCs2UARCSQYG0RGZcq1rNDaxb7+MiJGa7TXc8P7+Ghou9jH5x3auHQ0pptAyO3YsUBQ96AjwErQNmd8DfNKFvwMVDQjeEDcHUrP/7WCYkskQGIRICZA3Ng6oitmBGZ0q7YJgQIQPd/ZdJoytMJ8INYtiHqyPwmq/Xo6Tnnk8+9+Nr52+OSc5KqCqG0YIOAYJalqZNwo741Wqpx7uTaqSMzfcnvdUXuwLUKhKTeUhD4TJtBAR4wznSL52/c9BsbO8NRLmpBeH7Qn5utHuzxbF8M8OIxkABOPO1/+ODv/4PT8udA0TYKA97mHGO/Ba6ub371ZVx4662N7TFYHCQpOHQ8HvYHs1qKN6O1ud7ZU6tPnjmytgDPwyr2P2wFFGAMB7wHohFweX3z0tWNFy9c2toZD1s1Z3cyK70Y+r362NLg+OHl08cOrcyngJLbJoYAItA0tp9CcReKXZjEDLhPjqqItnN47cLb5y/duHx9dH2rbQwIFQWh4bhO5YHV3rnTKw+fWJ7vV6QOAB+yUbfG0F20xpsb2+WVN0YvvLa+fntLPYAELGBxJ3eHFrg58lzyMyeWPnrm8AOrg0rQRYrT1G0Kxd293axrzO8kAQGU0hJMQhhrGGasb5b1zfbm1minaSWG1cHi3ICPLvN8D4nM4bmwhA/f3q4jILqEt2/f+saLb7x4Yfv2KJaYogkJu6GYAiwiDDczCKgM+zw8sdz77JMPP3zikOZhigJMi89TKE7KIUrU0e/BDESTeXAqDSQ6uDWIAEBbWhFyxEhghzdjYqcoTnAQf8i6N0bNUKr+hevtN1648uLr17eshN7AqJJ2Z7LG7Hus9wyMLAShinLI2+dOr33246dXZlGRybSCMi3b7G4L0pbMkBCYd2cwzE2FiYzAtBtK1ZQYaJEdAURc1V3CZPAPoXBmVVVbBd99+eL3z9/O6PdqYzR5vB1T38wAI3Z31dJNH0mPs2U4p1bT62+uP7Ayd+zcIdExpD/FwwdoB+i+zZ5jiMzIObtaV2FnsoTISgGIMIICRqyAJiB4gbWg4t66tsEp6Hvu5A/aYcaOyXdeufHcy1d3yL2fhg1bG+rAuQRDdAumwS2KVEF6wjWTkYRM0avF22N5/eKN20OHTBtBp15x1xJFAMTMu0RFkwI7QUQAvCOUMfmP7D2GdtX46F42vhUgAJbzTpAKSEQwtJsb4xs3N24Pm+3ROISwND+3OKiXl+aZRAJMxyyAszsTBVPncO/PCe7EPWX91vkrY5bKYqtWhRwK2hjZ851c4D6Z8TWmWc87UXIxkn66eGtn2AB9mYJhCsUDHTLknGOsHbSx6S99d/3Zb33/mW++ceHixY2dcSfs0IvhxJHVj549+/N/88xDZ9aOHq3NiqqGIG07StV7O3ng8Lcu37q1OWqzRjeHMsEJavtqouXcMLMSFQcZm1lTshZImB5mTKF4IE3VRYxDbJW/8703f/+Lf/zlL/31xTdvx3Q4OySk7K6q4n7p6rVvv/j9f/fF7U/+jXO/8nc/+4uf+0QV2VFS1XO1944uyeHuvr5ZxhpDFDEqnh0ZCNl8PxJKYjiLOhxSTMnBMJq20U+heHB9Iot6Wzz9wR9+9//43/7gxe+er+r5VC222hrcFeokUlVBSm5atbI9+LOvXnrhhd97/fzwv/v1nzu0SKPRTq8avNdZ6+1tzZkQJsUZYaMgTPuKjTiZuRhHOIuVQc11JVONvCkUD7JXLB74i7//p//rb3/xjfMjpThsDS6RSdXcNAKey7gxhscYlVRRXb6y9a/+z/+32O1/8o9/aaYHYAT03odKEnXfmalTKCTaTzrdzKx7mFtEe3hhdqaOhnbqFj/4dGhqdzUJ4flnbv4///p7r30fJIssMecmSGrblllSCEIkRCmElCoiCtIfDofM6eYN/M6/ffb3f/cVt0HO7+EV7gZT5gecEtiNmUUCwNDuWGe/JSchJlNvNhZieXBtdpAwlYGfQvHgWlu2/uiPvvz88+edUtHWoTEGs7EkMVLVVgQhEKCtNq22zU7b78+EwFXVe/vK+h/+0Z9cvHgzxvIeQhFERIcXq14oWhotri7w4P6D3Hg/HHgHImJvB6GcPDx76vBSAISm8dEUigfVXn/Vv/H1iyVLqpx4DBRTZZRilVNdPDWZm8yKiqTv1E+pCFnT5JJhGl763oUXnr+oZfCevkkCPXh86dDiTJUCMxPEzF2N9pWlhJm5FkJZXuideXBtbakuufGpW5xC8cDaG2+/9tob617VrZqg5y33qoXsCFTIMpMyG7MRClkWZKVQMvUYItsc+eb/397Z9NZ1VWH4fdfa+5xzr5PU9o2DHZs6sZIGWlWkBSoQLVBERTuoVAoS/L6OWnXUEZ0jVShInUQFWqQKBaJaSqgTx4597957LQY3RgwwA4JbF61H5xeco+fsj/V1P9386FaBn4yB//I4XnxqbXU8mlqFuKf+MEnmmOjgGa7zCcROmrARooOWuj5O33/myStbk8YiORERV4xrm9PK9va2me3v7/ajzrx1vRxO91InflxCD5VkaQ2ESG5md+/erXWGdLJp1n2qWxfHO/tn68f7d3b3ivUibLPDhhmhIkKqm8NMQZI627m8sfz01ZWnNpcGgc4lpMV/OVQ8pWTJSZA7FXqrrc9S24Hi2BGO1UzEc981pFqTsM2bvpz8mbYM/eiZaxtpOPPHTz//2539w2oQOns3Pqo0c0tsmdYl+d6zW5vri+ur3UBDa7UhZXE2IkL8oeKpZLK4Yq2O+oVpqWxSSuu64T9uGrW5wawazE1S+9rqpO9PPLczeZGm51O3eGX50nL+5NbtW9v3/n7v4GA6MnirLqg5+2Rx2FqfbKxONpaX+g7KIjAIIQpqM0uxKIaKp5PLm19fW1v59K93BGNJuZZ9zbmZyzE3Ii7uBjeKMCsWFnj16kafTlzFms/BYRWacGH5zBPL33h6ht29truHg9nUzIZRfuJsf27AOFkSH0vxeV69KtgcDVCPvsCh4qnl0qXll354/eO33iVFZSGJNoO5ivx7FQXurXX9eFYOStm9em3r+rcuEyd+BmM9SGrMBhBF1dNCzpNF+BLdR/NovwDijWhwA0jJcIG5sTVvlJjt8+UTm5Jj6Yby8k+evf7cZt/Nmh1QCtlEjn1jKqZkK+ZWVy4Mr736nUtPLuHkYwQpjcC+oXMMnkeeMggVTZQsJODmMIAKds6hmjgAAkJhn6VXcD7eMAgVTye73/7u5pu/fHV1bUm01TYVdfDYa5jWSkqpTKfnl8+99rMf/fwXr5AztBNvuctSaElab00dhTygz7xNvYKGDGR3ZeO8uJomzIA4KnBUNQWjP4zv/eXCiO0eq5Y9VBnv3Mdv3r/x9jvv/+mTbcdgLiQAErlWIz13NC9mM9ooia9M8htvvvjrX718cXUEBz1+d0Go+Hi4zQ5n02FYqJAbv//ze+/99oMP/nD79n2VgdCuG0iptZhV81nuJKXZ889de/31H//0lefPjgE3pVmrokO8zCBUfAwVK5gA1GrN2T/YxYcf/uXG7z66efP2Z59tP3iwTyhoqly7eOHKla0fvLT+wgvfPH9hDJ8mJpiDTcW/gMqMIFT8/+bQ3AGQCrA2uqkI73z+cGfn3u79vel0KiJnzo4nk8XzK0usGEYAzL0K03xj+s82dkEQKv6XmO2J9HBxUwrA6l6ACo7MQdLMSAqlWXFY5qiWpqpU1HZoZl0etwqNgFEQKj4OrUIVOGrK+mhONQ1AKWU+wAzzSlyvSZPZTGTwJtWmOQMwh0Y2WRAq/g/WxWaFR33majOAqska5xLOB62mlI46mlspTVVFBLDaCkmVFHkUQaj4uCoe7VRhcBUFUB2Z89GOj3qfkjqf9GgO0IkG11apOl9Ia6gYhIpB8JUhws9BECoGQRAqBkGoGARBqBgEoWIQBKFiEISKQRCEikHwleAfCtejhoL/38MAAAAASUVORK5CYII=\"\n },\n \"$:/ipfs/image/tiddlywiki\": {\n \"title\": \"$:/ipfs/image/tiddlywiki\",\n \"_canonical_uri\": \"/ipfs/bafkreihzzc42nwumjeaz4d6kxsbxa6vy5llnsvqtz3xjjwnjrhwkjy5loq\",\n \"modified\": \"20200528080350311\",\n \"tags\": \"$:/ipfs/documentation $:/isAttachment $:/isIpfs\",\n \"type\": \"image/svg+xml\"\n },\n \"$:/ipfs/saver/api\": {\n \"title\": \"$:/ipfs/saver/api\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"$:/ipfs/saver/api/https/tube.copylaradio.com/5001\"\n },\n \"$:/ipfs/saver/ens/domain\": {\n \"title\": \"$:/ipfs/saver/ens/domain\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"\"\n },\n \"$:/ipfs/saver/export\": {\n \"title\": \"$:/ipfs/saver/export\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"json\"\n },\n \"$:/ipfs/saver/gateway\": {\n \"title\": \"$:/ipfs/saver/gateway\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"$:/ipfs/saver/gateway/https/tube.copylaradio.com\"\n },\n \"$:/ipfs/saver/ipns/key\": {\n \"title\": \"$:/ipfs/saver/ipns/key\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"\"\n },\n \"$:/ipfs/saver/ipns/name\": {\n \"title\": \"$:/ipfs/saver/ipns/name\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"\"\n },\n \"$:/ipfs/saver/policy\": {\n \"title\": \"$:/ipfs/saver/policy\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"gateway\"\n },\n \"$:/config/PreferredSaver\": {\n \"title\": \"$:/config/PreferredSaver\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"$:/plugins/ipfs/ipfs-saver.js\"\n },\n \"$:/ipfs/saver/protocol\": {\n \"title\": \"$:/ipfs/saver/protocol\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"ipfs\"\n },\n \"$:/ipfs/saver/provider\": {\n \"title\": \"$:/ipfs/saver/provider\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"http\"\n },\n \"$:/ipfs/saver/unpin\": {\n \"title\": \"$:/ipfs/saver/unpin\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"bluelightav.eth\",\n \"text\": \"no\"\n },\n \"$:/ipfs/saver/verbose\": {\n \"title\": \"$:/ipfs/saver/verbose\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"bluelightav.eth\",\n \"text\": \"yes\"\n },\n \"$:/plugins/ipfs/modules/parsers/audioparser.js\": {\n \"title\": \"$:/plugins/ipfs/modules/parsers/audioparser.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/modules/parsers/audioparser.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: parser\\n\\nThe audio parser parses an audio tiddler into an embeddable HTML element\\n\\n\\\\*/\\n\\n/**\\n * TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n *\\n * Copyright (c) 2004-2007, Jeremy Ruston\\n * Copyright (c) 2007-2018, UnaMesa Association\\n * Copyright (c) 2019-2020, Blue Light\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are met:\\n *\\n * * Redistributions of source code must retain the above copyright notice, this\\n * list of conditions and the following disclaimer.\\n *\\n * * Redistributions in binary form must reproduce the above copyright notice,\\n * this list of conditions and the following disclaimer in the documentation\\n * and/or other materials provided with the distribution.\\n *\\n * * Neither the name of the copyright holder nor the names of its\\n * contributors may be used to endorse or promote products derived from\\n * this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n var name = 'ipfs-audioparser'\\n\\n var AudioParser = function (type, text, options) {\\n var self = this\\n var value = 'data:' + type + ';base64,'\\n var element = {\\n type: 'element',\\n tag: 'audio',\\n attributes: {\\n controls: { type: 'string', value: 'controls' },\\n style: { type: 'string', value: 'width: 100%; object-fit: contain' }\\n }\\n }\\n if (\\n $tw.browser &&\\n options.tiddler !== undefined &&\\n options.tiddler !== null\\n ) {\\n var canonicalUri = options.tiddler.fields._canonical_uri\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n if (canonicalUri !== null) {\\n $tw.ipfs\\n .resolveUrl(false, true, canonicalUri)\\n .then(data => {\\n var { normalizedUrl, resolvedUrl } = data\\n var url =\\n resolvedUrl !== null\\n ? resolvedUrl.toString()\\n : normalizedUrl !== null\\n ? normalizedUrl.toString()\\n : null\\n if (url !== null) {\\n $tw.ipfs\\n .loadToBase64(url)\\n .then(loaded => {\\n element.attributes.src = {\\n type: 'string',\\n value: value + loaded.data\\n }\\n var parsedTiddler = $tw.utils.getChangedTiddler(\\n options.tiddler\\n )\\n $tw.rootWidget.refresh(parsedTiddler)\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n })\\n } else if (text) {\\n element.attributes.src = { type: 'string', value: value + text }\\n }\\n }\\n // Return the parsed tree\\n this.tree = [element]\\n }\\n\\n AudioParser.prototype.getLogger = function () {\\n if (window.log) {\\n return window.log.getLogger(name)\\n }\\n return console\\n }\\n\\n exports['audio/ogg'] = AudioParser\\n exports['audio/mpeg'] = AudioParser\\n exports['audio/mp3'] = AudioParser\\n exports['audio/mp4'] = AudioParser\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"parser\"\n },\n \"$:/plugins/ipfs/modules/parsers/binaryparser.js\": {\n \"title\": \"$:/plugins/ipfs/modules/parsers/binaryparser.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/modules/parsers/binaryparser.js\\ntype: application/javascript\\nmodule-type: parser\\n\\nThe binary parser parses a binary tiddler into a warning message and download link\\n\\n\\\\*/\\n\\n/**\\n * TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n *\\n * Copyright (c) 2004-2007, Jeremy Ruston\\n * Copyright (c) 2007-2018, UnaMesa Association\\n * Copyright (c) 2019-2020, Blue Light\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are met:\\n *\\n * * Redistributions of source code must retain the above copyright notice, this\\n * list of conditions and the following disclaimer.\\n *\\n * * Redistributions in binary form must reproduce the above copyright notice,\\n * this list of conditions and the following disclaimer in the documentation\\n * and/or other materials provided with the distribution.\\n *\\n * * Neither the name of the copyright holder nor the names of its\\n * contributors may be used to endorse or promote products derived from\\n * this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n const name = 'ipfs-binaryparser'\\n\\n var BINARY_WARNING_MESSAGE = '$:/core/ui/BinaryWarning'\\n var EXPORT_BUTTON_IMAGE = '$:/core/images/export-button'\\n\\n var BinaryParser = function (type, text, options) {\\n var self = this\\n // Transclude the binary data tiddler warning message\\n var warn = {\\n type: 'element',\\n tag: 'p',\\n children: [\\n {\\n type: 'transclude',\\n attributes: {\\n tiddler: { type: 'string', value: BINARY_WARNING_MESSAGE }\\n }\\n }\\n ]\\n }\\n // Create download link based on binary tiddler title\\n var link = {\\n type: 'element',\\n tag: 'a',\\n attributes: {\\n title: { type: 'indirect', textReference: '!!title' },\\n download: { type: 'indirect', textReference: '!!title' }\\n },\\n children: [\\n {\\n type: 'transclude',\\n attributes: {\\n tiddler: { type: 'string', value: EXPORT_BUTTON_IMAGE }\\n }\\n }\\n ]\\n }\\n if (\\n $tw.browser &&\\n options.tiddler !== undefined &&\\n options.tiddler !== null\\n ) {\\n var canonicalUri = options.tiddler.fields._canonical_uri\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n if (canonicalUri !== null) {\\n $tw.ipfs\\n .resolveUrl(false, true, canonicalUri)\\n .then(data => {\\n var { normalizedUrl, resolvedUrl } = data\\n var url =\\n resolvedUrl !== null\\n ? resolvedUrl.toString()\\n : normalizedUrl !== null\\n ? normalizedUrl.toString()\\n : null\\n if (url !== null) {\\n link.attributes.href = {\\n type: 'string',\\n value: url\\n }\\n var parsedTiddler = $tw.utils.getChangedTiddler(options.tiddler)\\n $tw.rootWidget.refresh(parsedTiddler)\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n })\\n } else if (text) {\\n link.attributes.href = {\\n type: 'string',\\n value: 'data:' + type + ';base64,' + text\\n }\\n }\\n }\\n // Combine warning message and download link in a div\\n var element = {\\n type: 'element',\\n tag: 'div',\\n attributes: {\\n class: { type: 'string', value: 'tc-binary-warning' }\\n },\\n children: [warn, link]\\n }\\n this.tree = [element]\\n }\\n\\n BinaryParser.prototype.getLogger = function () {\\n if (window.log) {\\n return window.log.getLogger(name)\\n }\\n return console\\n }\\n\\n exports['application/octet-stream'] = BinaryParser\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"module-type\": \"parser\"\n },\n \"$:/plugins/ipfs/modules/parsers/htmlparser.js\": {\n \"title\": \"$:/plugins/ipfs/modules/parsers/htmlparser.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/modules/parsers/htmlparser.js\\ntype: application/javascript\\nmodule-type: parser\\n\\nThe HTML parser displays text as raw HTML\\n\\n\\\\*/\\n\\n/**\\n * TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n *\\n * Copyright (c) 2004-2007, Jeremy Ruston\\n * Copyright (c) 2007-2018, UnaMesa Association\\n * Copyright (c) 2019-2020, Blue Light\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are met:\\n *\\n * * Redistributions of source code must retain the above copyright notice, this\\n * list of conditions and the following disclaimer.\\n *\\n * * Redistributions in binary form must reproduce the above copyright notice,\\n * this list of conditions and the following disclaimer in the documentation\\n * and/or other materials provided with the distribution.\\n *\\n * * Neither the name of the copyright holder nor the names of its\\n * contributors may be used to endorse or promote products derived from\\n * this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n const name = 'ipfs-binaryparser'\\n\\n var HtmlParser = function (type, text, options) {\\n var self = this\\n var value = 'data:text/html;charset=utf-8,'\\n var src\\n if (\\n $tw.browser &&\\n options.tiddler !== undefined &&\\n options.tiddler !== null\\n ) {\\n var canonicalUri = options.tiddler.fields._canonical_uri\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n if (canonicalUri !== null) {\\n $tw.ipfs\\n .resolveUrl(false, true, canonicalUri)\\n .then(data => {\\n var { normalizedUrl, resolvedUrl } = data\\n var url =\\n resolvedUrl !== null\\n ? resolvedUrl.toString()\\n : normalizedUrl !== null\\n ? normalizedUrl.toString()\\n : null\\n if (url !== null) {\\n src = url\\n var parsedTiddler = $tw.utils.getChangedTiddler(options.tiddler)\\n $tw.rootWidget.refresh(parsedTiddler)\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n })\\n } else if (text) {\\n src = value + encodeURIComponent(text)\\n }\\n }\\n this.tree = [\\n {\\n type: 'element',\\n tag: 'iframe',\\n attributes: {\\n src: { type: 'string', value: src },\\n sandbox: { type: 'string', value: '' }\\n }\\n }\\n ]\\n }\\n\\n HtmlParser.prototype.getLogger = function () {\\n if (window.log) {\\n return window.log.getLogger(name)\\n }\\n return console\\n }\\n\\n exports['text/html'] = HtmlParser\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"module-type\": \"parser\"\n },\n \"$:/plugins/ipfs/modules/parsers/imageparser.js\": {\n \"title\": \"$:/plugins/ipfs/modules/parsers/imageparser.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/modules/parsers/imageparser.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: parser\\n\\nThe image parser parses an image into an embeddable HTML element\\n\\n\\\\*/\\n\\n/**\\n * TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n *\\n * Copyright (c) 2004-2007, Jeremy Ruston\\n * Copyright (c) 2007-2018, UnaMesa Association\\n * Copyright (c) 2019-2020, Blue Light\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are met:\\n *\\n * * Redistributions of source code must retain the above copyright notice, this\\n * list of conditions and the following disclaimer.\\n *\\n * * Redistributions in binary form must reproduce the above copyright notice,\\n * this list of conditions and the following disclaimer in the documentation\\n * and/or other materials provided with the distribution.\\n *\\n * * Neither the name of the copyright holder nor the names of its\\n * contributors may be used to endorse or promote products derived from\\n * this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n var name = 'ipfs-imageparser'\\n\\n var ImageParser = function (type, text, options) {\\n var self = this\\n var value = 'data:' + type + ';base64,'\\n var element = {\\n type: 'element',\\n tag: 'img',\\n attributes: {}\\n }\\n if (\\n $tw.browser &&\\n options.tiddler !== undefined &&\\n options.tiddler !== null\\n ) {\\n var canonicalUri = options.tiddler.fields._canonical_uri\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n if (canonicalUri !== null) {\\n $tw.ipfs\\n .resolveUrl(false, true, canonicalUri)\\n .then(data => {\\n var { normalizedUrl, resolvedUrl } = data\\n var url =\\n resolvedUrl !== null\\n ? resolvedUrl.toString()\\n : normalizedUrl !== null\\n ? normalizedUrl.toString()\\n : null\\n if (url !== null) {\\n $tw.ipfs\\n .loadToBase64(url)\\n .then(loaded => {\\n element.attributes.src = {\\n type: 'string',\\n value: value + loaded.data\\n }\\n var parsedTiddler = $tw.utils.getChangedTiddler(\\n options.tiddler\\n )\\n $tw.rootWidget.refresh(parsedTiddler)\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n })\\n } else if (text) {\\n element.attributes.src = { type: 'string', value: value + text }\\n }\\n }\\n // Return the parsed tree\\n this.tree = [element]\\n }\\n\\n ImageParser.prototype.getLogger = function () {\\n if (window.log) {\\n return window.log.getLogger(name)\\n }\\n return console\\n }\\n\\n exports['image/jpg'] = ImageParser\\n exports['image/jpeg'] = ImageParser\\n exports['image/png'] = ImageParser\\n exports['image/gif'] = ImageParser\\n exports['image/webp'] = ImageParser\\n exports['image/heic'] = ImageParser\\n exports['image/heif'] = ImageParser\\n exports['image/x-icon'] = ImageParser\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"parser\"\n },\n \"$:/plugins/ipfs/modules/parsers/pdfparser.js\": {\n \"title\": \"$:/plugins/ipfs/modules/parsers/pdfparser.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/modules/parsers/pdfparser.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: parser\\n\\nThe PDF parser embeds a PDF viewer\\n\\n\\\\*/\\n\\n/**\\n * TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n *\\n * Copyright (c) 2004-2007, Jeremy Ruston\\n * Copyright (c) 2007-2018, UnaMesa Association\\n * Copyright (c) 2019-2020, Blue Light\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are met:\\n *\\n * * Redistributions of source code must retain the above copyright notice, this\\n * list of conditions and the following disclaimer.\\n *\\n * * Redistributions in binary form must reproduce the above copyright notice,\\n * this list of conditions and the following disclaimer in the documentation\\n * and/or other materials provided with the distribution.\\n *\\n * * Neither the name of the copyright holder nor the names of its\\n * contributors may be used to endorse or promote products derived from\\n * this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n const name = 'ipfs-pdfparser'\\n\\n var PdfParser = function (type, text, options) {\\n var self = this\\n var value = 'data:application/pdf;base64,'\\n var element = {\\n type: 'element',\\n tag: 'embed',\\n attributes: {}\\n }\\n if (\\n $tw.browser &&\\n options.tiddler !== undefined &&\\n options.tiddler !== null\\n ) {\\n var canonicalUri = options.tiddler.fields._canonical_uri\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n if (canonicalUri !== null) {\\n $tw.ipfs\\n .resolveUrl(false, true, canonicalUri)\\n .then(data => {\\n var { normalizedUrl, resolvedUrl } = data\\n var url =\\n resolvedUrl !== null\\n ? resolvedUrl.toString()\\n : normalizedUrl !== null\\n ? normalizedUrl.toString()\\n : null\\n if (url !== null) {\\n $tw.ipfs\\n .loadToBase64(url)\\n .then(loaded => {\\n element.attributes.src = {\\n type: 'string',\\n value: value + loaded.data\\n }\\n var parsedTiddler = $tw.utils.getChangedTiddler(\\n options.tiddler\\n )\\n $tw.rootWidget.refresh(parsedTiddler)\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n })\\n } else if (text) {\\n element.attributes.src = { type: 'string', value: value + text }\\n }\\n }\\n // Return the parsed tree\\n this.tree = [element]\\n }\\n\\n PdfParser.prototype.getLogger = function () {\\n if (window.log) {\\n return window.log.getLogger(name)\\n }\\n return console\\n }\\n\\n exports['application/pdf'] = PdfParser\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"parser\"\n },\n \"$:/plugins/ipfs/modules/parsers/svgparser.js\": {\n \"title\": \"$:/plugins/ipfs/modules/parsers/svgparser.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/modules/parsers/svgparser.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: parser\\n\\nThe image parser parses an image into an embeddable HTML element\\n\\n\\\\*/\\n\\n/**\\n * TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n *\\n * Copyright (c) 2004-2007, Jeremy Ruston\\n * Copyright (c) 2007-2018, UnaMesa Association\\n * Copyright (c) 2019-2020, Blue Light\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are met:\\n *\\n * * Redistributions of source code must retain the above copyright notice, this\\n * list of conditions and the following disclaimer.\\n *\\n * * Redistributions in binary form must reproduce the above copyright notice,\\n * this list of conditions and the following disclaimer in the documentation\\n * and/or other materials provided with the distribution.\\n *\\n * * Neither the name of the copyright holder nor the names of its\\n * contributors may be used to endorse or promote products derived from\\n * this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n const name = 'ipfs-svgparser'\\n\\n var SvgParser = function (type, text, options) {\\n var self = this\\n var value = 'data:image/svg+xml,'\\n var element = {\\n type: 'element',\\n tag: 'img',\\n attributes: {}\\n }\\n if (\\n $tw.browser &&\\n options.tiddler !== undefined &&\\n options.tiddler !== null\\n ) {\\n var canonicalUri = options.tiddler.fields._canonical_uri\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n if (canonicalUri !== null) {\\n $tw.ipfs\\n .resolveUrl(false, true, canonicalUri)\\n .then(data => {\\n var { normalizedUrl, resolvedUrl } = data\\n var url =\\n resolvedUrl !== null\\n ? resolvedUrl.toString()\\n : normalizedUrl !== null\\n ? normalizedUrl.toString()\\n : null\\n if (url !== null) {\\n $tw.ipfs\\n .loadToUtf8(url)\\n .then(loaded => {\\n element.attributes.src = {\\n type: 'string',\\n value: value + encodeURIComponent(loaded.data)\\n }\\n var parsedTiddler = $tw.utils.getChangedTiddler(\\n options.tiddler\\n )\\n $tw.rootWidget.refresh(parsedTiddler)\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n })\\n } else {\\n element.attributes.src = {\\n type: 'string',\\n value: value + encodeURIComponent(text)\\n }\\n }\\n }\\n // Return the parsed tree\\n this.tree = [element]\\n }\\n\\n SvgParser.prototype.getLogger = function () {\\n if (window.log) {\\n return window.log.getLogger(name)\\n }\\n return console\\n }\\n\\n exports['image/svg+xml'] = SvgParser\\n exports['.svg'] = SvgParser\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"parser\"\n },\n \"$:/plugins/ipfs/modules/parsers/videoparser.js\": {\n \"title\": \"$:/plugins/ipfs/modules/parsers/videoparser.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/modules/parsers/videoparser.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: parser\\n\\nThe video parser parses a video tiddler into an embeddable HTML element\\n\\n\\\\*/\\n\\n/**\\n * TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n *\\n * Copyright (c) 2004-2007, Jeremy Ruston\\n * Copyright (c) 2007-2018, UnaMesa Association\\n * Copyright (c) 2019-2020, Blue Light\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are met:\\n *\\n * * Redistributions of source code must retain the above copyright notice, this\\n * list of conditions and the following disclaimer.\\n *\\n * * Redistributions in binary form must reproduce the above copyright notice,\\n * this list of conditions and the following disclaimer in the documentation\\n * and/or other materials provided with the distribution.\\n *\\n * * Neither the name of the copyright holder nor the names of its\\n * contributors may be used to endorse or promote products derived from\\n * this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n const name = 'ipfs-videoparser'\\n\\n var VideoParser = function (type, text, options) {\\n var self = this\\n var value = 'data:' + type + ';base64,'\\n var element = {\\n type: 'element',\\n tag: 'video',\\n attributes: {\\n controls: { type: 'string', value: 'controls' },\\n style: { type: 'string', value: 'width: 100%; object-fit: contain' }\\n }\\n }\\n if (\\n $tw.browser &&\\n options.tiddler !== undefined &&\\n options.tiddler !== null\\n ) {\\n var canonicalUri = options.tiddler.fields._canonical_uri\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n if (canonicalUri !== null) {\\n $tw.ipfs\\n .resolveUrl(false, true, canonicalUri)\\n .then(data => {\\n var { normalizedUrl, resolvedUrl } = data\\n var url =\\n resolvedUrl !== null\\n ? resolvedUrl.toString()\\n : normalizedUrl !== null\\n ? normalizedUrl.toString()\\n : null\\n if (url !== null) {\\n $tw.ipfs\\n .loadToBase64(url)\\n .then(loaded => {\\n element.attributes.src = {\\n type: 'string',\\n value: value + loaded.data\\n }\\n var parsedTiddler = $tw.utils.getChangedTiddler(\\n options.tiddler\\n )\\n $tw.rootWidget.refresh(parsedTiddler)\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n })\\n } else if (text) {\\n element.attributes.src = { type: 'string', value: value + text }\\n }\\n }\\n // Return the parsed tree\\n this.tree = [element]\\n }\\n\\n VideoParser.prototype.getLogger = function () {\\n if (window.log) {\\n return window.log.getLogger(name)\\n }\\n return console\\n }\\n\\n exports['video/ogg'] = VideoParser\\n exports['video/webm'] = VideoParser\\n exports['video/mp4'] = VideoParser\\n exports['video/quicktime'] = VideoParser\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"parser\"\n },\n \"$:/plugins/ipfs/modules/parsers/wikiparser/wikiparser.js\": {\n \"title\": \"$:/plugins/ipfs/modules/parsers/wikiparser/wikiparser.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/modules/parsers/wikiparser/wikiparser.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: parser\\n\\nwikiparser\\n\\n\\\\*/\\n\\n/**\\n * TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n *\\n * Copyright (c) 2004-2007, Jeremy Ruston\\n * Copyright (c) 2007-2020, UnaMesa Association\\n * Copyright (c) 2019-2020, Blue Light\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are met:\\n *\\n * * Redistributions of source code must retain the above copyright notice, this\\n * list of conditions and the following disclaimer.\\n *\\n * * Redistributions in binary form must reproduce the above copyright notice,\\n * this list of conditions and the following disclaimer in the documentation\\n * and/or other materials provided with the distribution.\\n *\\n * * Neither the name of the copyright holder nor the names of its\\n * contributors may be used to endorse or promote products derived from\\n * this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n const IpfsImport = require('$:/plugins/ipfs/ipfs-import.js').IpfsImport\\n\\n var name = 'ipfs-wikiparser'\\n\\n var WikiParser = function (type, text, options) {\\n var self = this\\n this.wiki = options.wiki\\n // Check for an externally linked tiddler\\n if (\\n $tw.browser &&\\n (text || '') === '' &&\\n options.tiddler !== undefined &&\\n options.tiddler !== null\\n ) {\\n var canonicalUri = options.tiddler.fields._canonical_uri\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n var importUri = options.tiddler.fields._import_uri\\n importUri =\\n importUri === undefined || importUri == null || importUri.trim() === ''\\n ? null\\n : importUri.trim()\\n if (canonicalUri !== null || importUri !== null) {\\n var ipfsImport = new IpfsImport()\\n ipfsImport\\n .import(canonicalUri, importUri, options.tiddler)\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n text = $tw.language.getRawString('LazyLoadingWarning')\\n }\\n }\\n // Initialise the classes if we don't have them already\\n if (!this.pragmaRuleClasses) {\\n WikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\\n 'wikirule',\\n 'pragma',\\n $tw.WikiRuleBase\\n )\\n this.setupRules(\\n WikiParser.prototype.pragmaRuleClasses,\\n '$:/config/WikiParserRules/Pragmas/'\\n )\\n }\\n if (!this.blockRuleClasses) {\\n WikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\\n 'wikirule',\\n 'block',\\n $tw.WikiRuleBase\\n )\\n this.setupRules(\\n WikiParser.prototype.blockRuleClasses,\\n '$:/config/WikiParserRules/Block/'\\n )\\n }\\n if (!this.inlineRuleClasses) {\\n WikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\\n 'wikirule',\\n 'inline',\\n $tw.WikiRuleBase\\n )\\n this.setupRules(\\n WikiParser.prototype.inlineRuleClasses,\\n '$:/config/WikiParserRules/Inline/'\\n )\\n }\\n // Save the parse text\\n this.type = type || 'text/vnd.tiddlywiki'\\n this.source = text || ''\\n this.sourceLength = this.source.length\\n // Flag for ignoring whitespace\\n this.configTrimWhiteSpace = false\\n // Set current parse position\\n this.pos = 0\\n // Instantiate the pragma parse rules\\n this.pragmaRules = this.instantiateRules(\\n this.pragmaRuleClasses,\\n 'pragma',\\n 0\\n )\\n // Instantiate the parser block and inline rules\\n this.blockRules = this.instantiateRules(this.blockRuleClasses, 'block', 0)\\n this.inlineRules = this.instantiateRules(\\n this.inlineRuleClasses,\\n 'inline',\\n 0\\n )\\n // Parse any pragmas\\n this.tree = []\\n var topBranch = this.parsePragmas()\\n // Parse the text into inline runs or blocks\\n if (options.parseAsInline) {\\n topBranch.push.apply(topBranch, this.parseInlineRun())\\n } else {\\n topBranch.push.apply(topBranch, this.parseBlocks())\\n }\\n // Return the parsed tree\\n }\\n\\n WikiParser.prototype.getLogger = function () {\\n if (window.log) {\\n return window.log.getLogger(name)\\n }\\n return console\\n }\\n\\n /*\\n */\\n WikiParser.prototype.setupRules = function (proto, configPrefix) {\\n var self = this\\n if (!$tw.safemode) {\\n $tw.utils.each(proto, function (object, name) {\\n if (\\n self.wiki.getTiddlerText(configPrefix + name, 'enable') !== 'enable'\\n ) {\\n delete proto[name]\\n }\\n })\\n }\\n }\\n\\n /*\\nInstantiate an array of parse rules\\n*/\\n WikiParser.prototype.instantiateRules = function (classes, type, startPos) {\\n var rulesInfo = []\\n var self = this\\n $tw.utils.each(classes, function (RuleClass) {\\n // Instantiate the rule\\n var rule = new RuleClass(self)\\n rule.is = {}\\n rule.is[type] = true\\n rule.init(self)\\n var matchIndex = rule.findNextMatch(startPos)\\n if (matchIndex !== undefined) {\\n rulesInfo.push({\\n rule: rule,\\n matchIndex: matchIndex\\n })\\n }\\n })\\n return rulesInfo\\n }\\n\\n /*\\nSkip any whitespace at the current position. Options are:\\n treatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\\n*/\\n WikiParser.prototype.skipWhitespace = function (options) {\\n options = options || {}\\n var whitespaceRegExp = options.treatNewlinesAsNonWhitespace\\n ? /([^\\\\S\\\\n]+)/gm\\n : /(\\\\s+)/gm\\n whitespaceRegExp.lastIndex = this.pos\\n var whitespaceMatch = whitespaceRegExp.exec(this.source)\\n if (whitespaceMatch && whitespaceMatch.index === this.pos) {\\n this.pos = whitespaceRegExp.lastIndex\\n }\\n }\\n\\n /*\\nGet the next match out of an array of parse rule instances\\n*/\\n WikiParser.prototype.findNextMatch = function (rules, startPos) {\\n // Find the best matching rule by finding the closest match position\\n var matchingRule\\n var matchingRulePos = this.sourceLength\\n // Step through each rule\\n for (var t = 0; t \u003C rules.length; t++) {\\n var ruleInfo = rules[t]\\n // Ask the rule to get the next match if we've moved past the current one\\n if (ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex \u003C startPos) {\\n ruleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos)\\n }\\n // Adopt this match if it's closer than the current best match\\n if (\\n ruleInfo.matchIndex !== undefined &&\\n ruleInfo.matchIndex \u003C= matchingRulePos\\n ) {\\n matchingRule = ruleInfo\\n matchingRulePos = ruleInfo.matchIndex\\n }\\n }\\n return matchingRule\\n }\\n\\n /*\\nParse any pragmas at the beginning of a block of parse text\\n*/\\n WikiParser.prototype.parsePragmas = function () {\\n var currentTreeBranch = this.tree\\n while (true) {\\n // Skip whitespace\\n this.skipWhitespace()\\n // Check for the end of the text\\n if (this.pos >= this.sourceLength) {\\n break\\n }\\n // Check if we've arrived at a pragma rule match\\n var nextMatch = this.findNextMatch(this.pragmaRules, this.pos)\\n // If not, just exit\\n if (!nextMatch || nextMatch.matchIndex !== this.pos) {\\n break\\n }\\n // Process the pragma rule\\n var subTree = nextMatch.rule.parse()\\n if (subTree.length > 0) {\\n // Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\\n currentTreeBranch.push.apply(currentTreeBranch, subTree)\\n subTree[0].children = []\\n currentTreeBranch = subTree[0].children\\n }\\n }\\n return currentTreeBranch\\n }\\n\\n /*\\nParse a block from the current position\\n terminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\\n*/\\n WikiParser.prototype.parseBlock = function (terminatorRegExpString) {\\n var terminatorRegExp = terminatorRegExpString\\n ? new RegExp('(' + terminatorRegExpString + '|\\\\\\\\r?\\\\\\\\n\\\\\\\\r?\\\\\\\\n)', 'gm')\\n : /(\\\\r?\\\\n\\\\r?\\\\n)/gm\\n this.skipWhitespace()\\n if (this.pos >= this.sourceLength) {\\n return []\\n }\\n // Look for a block rule that applies at the current position\\n var nextMatch = this.findNextMatch(this.blockRules, this.pos)\\n if (nextMatch && nextMatch.matchIndex === this.pos) {\\n return nextMatch.rule.parse()\\n }\\n // Treat it as a paragraph if we didn't find a block rule\\n return [\\n {\\n type: 'element',\\n tag: 'p',\\n children: this.parseInlineRun(terminatorRegExp)\\n }\\n ]\\n }\\n\\n /*\\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\\n terminatorRegExpString: terminating regular expression\\n*/\\n WikiParser.prototype.parseBlocks = function (terminatorRegExpString) {\\n if (terminatorRegExpString) {\\n return this.parseBlocksTerminated(terminatorRegExpString)\\n } else {\\n return this.parseBlocksUnterminated()\\n }\\n }\\n\\n /*\\nParse a block from the current position to the end of the text\\n*/\\n WikiParser.prototype.parseBlocksUnterminated = function () {\\n var tree = []\\n while (this.pos \u003C this.sourceLength) {\\n tree.push.apply(tree, this.parseBlock())\\n }\\n return tree\\n }\\n\\n /*\\nParse blocks of text until a terminating regexp is encountered\\n*/\\n WikiParser.prototype.parseBlocksTerminated = function (\\n terminatorRegExpString\\n ) {\\n var terminatorRegExp = new RegExp('(' + terminatorRegExpString + ')', 'gm')\\n var tree = []\\n // Skip any whitespace\\n this.skipWhitespace()\\n // Check if we've got the end marker\\n terminatorRegExp.lastIndex = this.pos\\n var match = terminatorRegExp.exec(this.source)\\n // Parse the text into blocks\\n while (\\n this.pos \u003C this.sourceLength &&\\n !(match && match.index === this.pos)\\n ) {\\n var blocks = this.parseBlock(terminatorRegExpString)\\n tree.push.apply(tree, blocks)\\n // Skip any whitespace\\n this.skipWhitespace()\\n // Check if we've got the end marker\\n terminatorRegExp.lastIndex = this.pos\\n match = terminatorRegExp.exec(this.source)\\n }\\n if (match && match.index === this.pos) {\\n this.pos = match.index + match[0].length\\n }\\n return tree\\n }\\n\\n /*\\nParse a run of text at the current position\\n terminatorRegExp: a regexp at which to stop the run\\n options: see below\\nOptions available:\\n eatTerminator: move the parse position past any encountered terminator (default false)\\n*/\\n WikiParser.prototype.parseInlineRun = function (terminatorRegExp, options) {\\n if (terminatorRegExp) {\\n return this.parseInlineRunTerminated(terminatorRegExp, options)\\n } else {\\n return this.parseInlineRunUnterminated(options)\\n }\\n }\\n\\n WikiParser.prototype.parseInlineRunUnterminated = function (options) {\\n var tree = []\\n // Find the next occurrence of an inline rule\\n var nextMatch = this.findNextMatch(this.inlineRules, this.pos)\\n // Loop around the matches until we've reached the end of the text\\n while (this.pos \u003C this.sourceLength && nextMatch) {\\n // Process the text preceding the run rule\\n if (nextMatch.matchIndex > this.pos) {\\n this.pushTextWidget(\\n tree,\\n this.source.substring(this.pos, nextMatch.matchIndex)\\n )\\n this.pos = nextMatch.matchIndex\\n }\\n // Process the run rule\\n tree.push.apply(tree, nextMatch.rule.parse())\\n // Look for the next run rule\\n nextMatch = this.findNextMatch(this.inlineRules, this.pos)\\n }\\n // Process the remaining text\\n if (this.pos \u003C this.sourceLength) {\\n this.pushTextWidget(tree, this.source.substr(this.pos))\\n }\\n this.pos = this.sourceLength\\n return tree\\n }\\n\\n WikiParser.prototype.parseInlineRunTerminated = function (\\n terminatorRegExp,\\n options\\n ) {\\n options = options || {}\\n var tree = []\\n // Find the next occurrence of the terminator\\n terminatorRegExp.lastIndex = this.pos\\n var terminatorMatch = terminatorRegExp.exec(this.source)\\n // Find the next occurrence of a inlinerule\\n var inlineRuleMatch = this.findNextMatch(this.inlineRules, this.pos)\\n // Loop around until we've reached the end of the text\\n while (\\n this.pos \u003C this.sourceLength &&\\n (terminatorMatch || inlineRuleMatch)\\n ) {\\n // Return if we've found the terminator, and it precedes any inline rule match\\n if (terminatorMatch) {\\n if (\\n !inlineRuleMatch ||\\n inlineRuleMatch.matchIndex >= terminatorMatch.index\\n ) {\\n if (terminatorMatch.index > this.pos) {\\n this.pushTextWidget(\\n tree,\\n this.source.substring(this.pos, terminatorMatch.index)\\n )\\n }\\n this.pos = terminatorMatch.index\\n if (options.eatTerminator) {\\n this.pos += terminatorMatch[0].length\\n }\\n return tree\\n }\\n }\\n // Process any inline rule, along with the text preceding it\\n if (inlineRuleMatch) {\\n // Preceding text\\n if (inlineRuleMatch.matchIndex > this.pos) {\\n this.pushTextWidget(\\n tree,\\n this.source.substring(this.pos, inlineRuleMatch.matchIndex)\\n )\\n this.pos = inlineRuleMatch.matchIndex\\n }\\n // Process the inline rule\\n tree.push.apply(tree, inlineRuleMatch.rule.parse())\\n // Look for the next inline rule\\n inlineRuleMatch = this.findNextMatch(this.inlineRules, this.pos)\\n // Look for the next terminator match\\n terminatorRegExp.lastIndex = this.pos\\n terminatorMatch = terminatorRegExp.exec(this.source)\\n }\\n }\\n // Process the remaining text\\n if (this.pos \u003C this.sourceLength) {\\n this.pushTextWidget(tree, this.source.substr(this.pos))\\n }\\n this.pos = this.sourceLength\\n return tree\\n }\\n\\n /*\\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\\n*/\\n WikiParser.prototype.pushTextWidget = function (array, text) {\\n if (this.configTrimWhiteSpace) {\\n text = $tw.utils.trim(text)\\n }\\n if (text) {\\n array.push({ type: 'text', text: text })\\n }\\n }\\n\\n /*\\nParse zero or more class specifiers `.classname`\\n*/\\n /*eslint no-useless-escape: \\\"off\\\"*/\\n WikiParser.prototype.parseClasses = function () {\\n var classRegExp = /\\\\.([^\\\\s\\\\.]+)/gm\\n var classNames = []\\n classRegExp.lastIndex = this.pos\\n var match = classRegExp.exec(this.source)\\n while (match && match.index === this.pos) {\\n this.pos = match.index + match[0].length\\n classNames.push(match[1])\\n match = classRegExp.exec(this.source)\\n }\\n return classNames\\n }\\n\\n /*\\nAmend the rules used by this instance of the parser\\n type: `only` keeps just the named rules, `except` keeps all but the named rules\\n names: array of rule names\\n*/\\n WikiParser.prototype.amendRules = function (type, names) {\\n names = names || []\\n // Define the filter function\\n var keepFilter\\n if (type === 'only') {\\n keepFilter = function (name) {\\n return names.indexOf(name) !== -1\\n }\\n } else if (type === 'except') {\\n keepFilter = function (name) {\\n return names.indexOf(name) === -1\\n }\\n } else {\\n return\\n }\\n // Define a function to process each of our rule arrays\\n var processRuleArray = function (ruleArray) {\\n for (var t = ruleArray.length - 1; t >= 0; t--) {\\n if (!keepFilter(ruleArray[t].rule.name)) {\\n ruleArray.splice(t, 1)\\n }\\n }\\n }\\n // Process each rule array\\n processRuleArray(this.pragmaRules)\\n processRuleArray(this.blockRules)\\n processRuleArray(this.inlineRules)\\n }\\n\\n exports['text/vnd.tiddlywiki'] = WikiParser\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"parser\"\n },\n \"$:/core/modules/saver-handler.js\": {\n \"title\": \"$:/core/modules/saver-handler.js\",\n \"text\": \"/*\\\\\\ntitle: $:/core/modules/saver-handler.js\\ntype: application/javascript\\nmodule-type: global\\n\\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\\n\\n\\\\*/\\n\\n/**\\n * TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n *\\n * Copyright (c) 2004-2007, Jeremy Ruston\\n * Copyright (c) 2007-2018, UnaMesa Association\\n * Copyright (c) 2019-2020, Blue Light\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are met:\\n *\\n * * Redistributions of source code must retain the above copyright notice, this\\n * list of conditions and the following disclaimer.\\n *\\n * * Redistributions in binary form must reproduce the above copyright notice,\\n * this list of conditions and the following disclaimer in the documentation\\n * and/or other materials provided with the distribution.\\n *\\n * * Neither the name of the copyright holder nor the names of its\\n * contributors may be used to endorse or promote products derived from\\n * this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n /*\\nInstantiate the saver handler with the following options:\\nwiki: wiki to be synced\\ndirtyTracking: true if dirty tracking should be performed\\n*/\\n function SaverHandler (options) {\\n var self = this\\n this.wiki = options.wiki\\n this.dirtyTracking = options.dirtyTracking\\n this.preloadDirty = options.preloadDirty || []\\n this.pendingAutoSave = false\\n // Make a logger\\n this.logger = new $tw.utils.Logger('saver-handler')\\n // Initialise our savers\\n if ($tw.browser) {\\n this.initSavers()\\n }\\n // Only do dirty tracking if required\\n if ($tw.browser && this.dirtyTracking) {\\n // Compile the dirty tiddler filter\\n this.filterFn = this.wiki.compileFilter(\\n this.wiki.getTiddlerText(this.titleSyncFilter)\\n )\\n // Count of changes that have not yet been saved\\n var filteredChanges = self.filterFn.call(self.wiki, function (iterator) {\\n $tw.utils.each(self.preloadDirty, function (title) {\\n var tiddler = self.wiki.getTiddler(title)\\n iterator(tiddler, title)\\n })\\n })\\n this.numChanges = filteredChanges.length\\n // Listen out for changes to tiddlers\\n this.wiki.addEventListener('change', async function (changes) {\\n // Filter the changes so that we only count changes to tiddlers that we care about\\n var filteredChanges = self.filterFn.call(self.wiki, function (\\n iterator\\n ) {\\n $tw.utils.each(changes, function (change, title) {\\n var tiddler = self.wiki.getTiddler(title)\\n iterator(tiddler, title)\\n })\\n })\\n // Adjust the number of changes\\n self.numChanges += filteredChanges.length\\n self.updateDirtyStatus()\\n // Do any autosave if one is pending and there's no more change events\\n if (\\n self.pendingAutoSave &&\\n self.wiki.getSizeOfTiddlerEventQueue() === 0\\n ) {\\n // Check if we're dirty\\n if (self.numChanges > 0) {\\n await self.saveWiki({\\n method: 'autosave',\\n downloadType: 'text/plain'\\n })\\n }\\n self.pendingAutoSave = false\\n }\\n })\\n // Listen for the autosave event\\n $tw.rootWidget.addEventListener('tm-auto-save-wiki', async function (\\n event\\n ) {\\n // Do the autosave unless there are outstanding tiddler change events\\n if (self.wiki.getSizeOfTiddlerEventQueue() === 0) {\\n // Check if we're dirty\\n if (self.numChanges > 0) {\\n await self.saveWiki({\\n method: 'autosave',\\n downloadType: 'text/plain'\\n })\\n }\\n } else {\\n // Otherwise put ourselves in the \\\"pending autosave\\\" state and wait for the change event before we do the autosave\\n self.pendingAutoSave = true\\n }\\n })\\n // Set up our beforeunload handler\\n $tw.addUnloadTask(function (event) {\\n var confirmationMessage\\n if (self.isDirty()) {\\n confirmationMessage = $tw.language.getString('UnsavedChangesWarning')\\n event.returnValue = confirmationMessage // Gecko\\n }\\n return confirmationMessage\\n })\\n }\\n // Install the save action handlers\\n if ($tw.browser) {\\n $tw.rootWidget.addEventListener('tm-save-wiki', async function (event) {\\n await self.saveWiki({\\n template: event.param,\\n downloadType: 'text/plain',\\n variables: event.paramObject\\n })\\n })\\n $tw.rootWidget.addEventListener('tm-download-file', async function (\\n event\\n ) {\\n await self.saveWiki({\\n method: 'download',\\n template: event.param,\\n downloadType: 'text/plain',\\n variables: event.paramObject\\n })\\n })\\n }\\n }\\n\\n SaverHandler.prototype.titleSyncFilter = '$:/config/SaverFilter'\\n SaverHandler.prototype.titleAutoSave = '$:/config/AutoSave'\\n SaverHandler.prototype.titleSavedNotification =\\n '$:/language/Notifications/Save/Done'\\n\\n /*\\nSelect the appropriate saver modules and set them up\\n*/\\n SaverHandler.prototype.initSavers = function (moduleType) {\\n moduleType = moduleType || 'saver'\\n // Instantiate the available savers\\n this.savers = []\\n var self = this\\n $tw.modules.forEachModuleOfType(moduleType, function (title, module) {\\n if (module.canSave(self)) {\\n self.savers.push({ title: title, module: module.create(self.wiki) })\\n }\\n })\\n // Sort savers\\n this.sortSavers()\\n }\\n\\n /*\\n * Sort the savers into priority order\\n */\\n SaverHandler.prototype.sortSavers = function () {\\n this.savers.sort(function (a, b) {\\n if (a.module.info.priority \u003C b.module.info.priority) {\\n return -1\\n } else {\\n if (a.module.info.priority > b.module.info.priority) {\\n return +1\\n } else {\\n return 0\\n }\\n }\\n })\\n }\\n\\n /*\\nSave the wiki contents. Options are:\\nmethod: \\\"save\\\", \\\"autosave\\\" or \\\"download\\\"\\ntemplate: the tiddler containing the template to save\\ndownloadType: the content type for the saved file\\n*/\\n SaverHandler.prototype.saveWiki = async function (options) {\\n options = options || {}\\n var self = this\\n var method = options.method || 'save'\\n // Ignore autosave if disabled\\n if (\\n method === 'autosave' &&\\n this.wiki.getTiddlerText(this.titleAutoSave, 'yes') !== 'yes'\\n ) {\\n return false\\n }\\n var variables = options.variables || {}\\n var template = options.template || '$:/core/save/all'\\n var downloadType = options.downloadType || 'text/plain'\\n var text = this.wiki.renderTiddler(downloadType, template, options)\\n var callback = function (err) {\\n if (err) {\\n alert($tw.language.getString('Error/WhileSaving') + ':\\\\n\\\\n' + err)\\n } else {\\n // Clear the task queue if we're saving (rather than downloading)\\n if (method !== 'download') {\\n self.numChanges = 0\\n self.updateDirtyStatus()\\n }\\n $tw.notifier.display(self.titleSavedNotification)\\n if (options.callback) {\\n options.callback()\\n }\\n }\\n }\\n // Process preferred if any\\n var ignorePreferred = null\\n var preferredSaver = $tw.wiki.getTiddler('$:/config/PreferredSaver')\\n if (preferredSaver !== null && preferredSaver !== undefined) {\\n var title = preferredSaver.getFieldString('text')\\n title =\\n title === undefined || title == null || title.trim() === ''\\n ? null\\n : title.trim()\\n if (title !== null) {\\n ignorePreferred = title\\n // Process preferred saver\\n if (\\n await this.save(\\n this.getSaver(title).module,\\n method,\\n variables,\\n text,\\n callback\\n )\\n ) {\\n return true\\n }\\n }\\n }\\n\\n // Call the highest priority saver that supports this method\\n for (var t = this.savers.length - 1; t >= 0; t--) {\\n // Ignore failed preferred if any\\n if (this.savers[t].title === ignorePreferred) {\\n continue\\n }\\n // Process\\n if (\\n await this.save(\\n this.savers[t].module,\\n method,\\n variables,\\n text,\\n callback\\n )\\n ) {\\n return true\\n }\\n }\\n return false\\n }\\n\\n SaverHandler.prototype.getSaver = function (title) {\\n // Locate saver\\n var saver = null\\n for (var i = 0; i \u003C this.savers.length; i++) {\\n var current = this.savers[i]\\n if (current.title === title) {\\n saver = current\\n break\\n }\\n }\\n return saver\\n }\\n\\n SaverHandler.prototype.save = async function (\\n saver,\\n method,\\n variables,\\n text,\\n callback\\n ) {\\n if (saver.info.capabilities.indexOf(method) !== -1) {\\n var saved = await saver.save(text, method, callback, {\\n variables: { filename: variables.filename }\\n })\\n if (saved) {\\n this.logger.log(\\n 'Saved wiki with method',\\n method,\\n 'through saver',\\n saver.info.name\\n )\\n return true\\n }\\n }\\n return false\\n }\\n\\n /*\\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\\n*/\\n SaverHandler.prototype.isDirty = function () {\\n return this.numChanges > 0\\n }\\n\\n /*\\nUpdate the document body with the class \\\"tc-dirty\\\" if the wiki has unsaved/unsynced changes\\n*/\\n SaverHandler.prototype.updateDirtyStatus = function () {\\n if ($tw.browser) {\\n $tw.utils.toggleClass(document.body, 'tc-dirty', this.isDirty())\\n }\\n }\\n\\n exports.SaverHandler = SaverHandler\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"module-type\": \"global\"\n },\n \"$:/plugins/ipfs/modules/widgets/image.js\": {\n \"title\": \"$:/plugins/ipfs/modules/widgets/image.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/modules/widgets/image.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\\n\\n```\\n\u003C$image src=\\\"TiddlerTitle\\\" width=\\\"320\\\" height=\\\"400\\\" class=\\\"classnames\\\">\\n```\\n\\nThe image source can be the title of an existing tiddler or the URL of an external image.\\n\\nExternal images always generate an HTML `\u003Cimg>` tag.\\n\\nTiddlers that have a _canonical_uri field generate an HTML `\u003Cimg>` tag with the src attribute containing the URI.\\n\\nTiddlers that contain image data generate an HTML `\u003Cimg>` tag with the src attribute containing a base64 representation of the image.\\n\\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\\n\\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \\\"px\\\" suffix.\\n\\n\\\\*/\\n\\n/**\\n * TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n *\\n * Copyright (c) 2004-2007, Jeremy Ruston\\n * Copyright (c) 2007-2018, UnaMesa Association\\n * Copyright (c) 2019-2020, Blue Light\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are met:\\n *\\n * * Redistributions of source code must retain the above copyright notice, this\\n * list of conditions and the following disclaimer.\\n *\\n * * Redistributions in binary form must reproduce the above copyright notice,\\n * this list of conditions and the following disclaimer in the documentation\\n * and/or other materials provided with the distribution.\\n *\\n * * Neither the name of the copyright holder nor the names of its\\n * contributors may be used to endorse or promote products derived from\\n * this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n var Widget = require('$:/core/modules/widgets/widget.js').widget\\n\\n var name = 'ipfs-image'\\n\\n var ImageWidget = function (parseTreeNode, options) {\\n this.initialise(parseTreeNode, options)\\n }\\n\\n /*\\nInherit from the base widget class\\n*/\\n ImageWidget.prototype = new Widget()\\n\\n ImageWidget.prototype.getLogger = function () {\\n if (window.log) {\\n return window.log.getLogger(name)\\n }\\n return console\\n }\\n\\n /*\\nRender this widget into the DOM\\n*/\\n ImageWidget.prototype.render = function (parent, nextSibling) {\\n this.parentDomNode = parent\\n this.computeAttributes()\\n this.execute()\\n var self = this\\n // Create element\\n // Determine what type of image it is\\n var tiddler = this.wiki.getTiddler(this.imageSource)\\n // Create default element\\n var domNode = this.document.createElement('img')\\n if (!tiddler) {\\n // The source isn't the title of a tiddler, so we'll assume it's a URL\\n domNode.setAttribute(\\n 'src',\\n this.getVariable('tv-get-export-image-link', {\\n params: [{ name: 'src', value: this.imageSource }],\\n defaultValue: this.imageSource\\n })\\n )\\n } else {\\n // Check if it is an image tiddler\\n if (this.wiki.isImageTiddler(this.imageSource)) {\\n var type = tiddler.fields.type\\n var text = tiddler.fields.text\\n var canonicalUri = tiddler.fields._canonical_uri\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n // If the tiddler has body text then it doesn't need to be lazily loaded\\n if (text) {\\n // Render the appropriate element for the image type\\n switch (type) {\\n case 'application/pdf':\\n domNode = this.document.createElement('embed')\\n domNode.setAttribute('src', 'data:application/pdf;base64,' + text)\\n break\\n case 'image/svg+xml':\\n domNode.setAttribute(\\n 'src',\\n 'data:image/svg+xml,' + encodeURIComponent(text)\\n )\\n break\\n default:\\n domNode.setAttribute('src', 'data:' + type + ';base64,' + text)\\n break\\n }\\n } else if (canonicalUri) {\\n $tw.ipfs\\n .resolveUrl(false, true, canonicalUri)\\n .then(data => {\\n var { normalizedUrl, resolvedUrl } = data\\n var url =\\n resolvedUrl !== null\\n ? resolvedUrl.toString()\\n : normalizedUrl !== null\\n ? normalizedUrl.toString()\\n : null\\n if (url !== null) {\\n switch (type) {\\n case 'application/pdf':\\n domNode = this.document.createElement('embed')\\n $tw.ipfs\\n .loadToBase64(url)\\n .then(loaded => {\\n if (\\n loaded !== undefined &&\\n loaded !== null &&\\n loaded.data !== undefined &&\\n loaded.data !== null\\n ) {\\n domNode.setAttribute(\\n 'src',\\n 'data:application/pdf;base64,' + loaded.data\\n )\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n break\\n case 'image/svg+xml':\\n $tw.ipfs\\n .loadToUtf8(url)\\n .then(loaded => {\\n if (\\n loaded !== undefined &&\\n loaded !== null &&\\n loaded.data !== undefined &&\\n loaded.data !== null\\n ) {\\n domNode.setAttribute(\\n 'src',\\n 'data:image/svg+xml,' +\\n encodeURIComponent(loaded.data)\\n )\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n break\\n default:\\n $tw.ipfs\\n .loadToBase64(url)\\n .then(loaded => {\\n if (\\n loaded !== undefined &&\\n loaded !== null &&\\n loaded.data !== undefined &&\\n loaded.data !== null\\n ) {\\n domNode.setAttribute(\\n 'src',\\n 'data:' + type + ';base64,' + loaded.data\\n )\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n break\\n }\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n })\\n } else {\\n // Just trigger loading of the tiddler\\n this.wiki.getTiddlerText(this.imageSource)\\n domNode.setAttribute('src', '')\\n }\\n }\\n }\\n // Assign the attributes\\n if (this.imageClass) {\\n domNode.setAttribute('class', this.imageClass)\\n }\\n if (this.imageWidth) {\\n domNode.setAttribute('width', this.imageWidth)\\n }\\n if (this.imageHeight) {\\n domNode.setAttribute('height', this.imageHeight)\\n }\\n if (this.imageTooltip) {\\n domNode.setAttribute('title', this.imageTooltip)\\n }\\n if (this.imageAlt) {\\n domNode.setAttribute('alt', this.imageAlt)\\n }\\n // Insert element\\n parent.insertBefore(domNode, nextSibling)\\n this.domNodes.push(domNode)\\n }\\n\\n /*\\nCompute the internal state of the widget\\n*/\\n ImageWidget.prototype.execute = function () {\\n // Get our parameters\\n this.imageSource = this.getAttribute('source')\\n this.imageWidth = this.getAttribute('width')\\n this.imageHeight = this.getAttribute('height')\\n this.imageClass = this.getAttribute('class')\\n this.imageTooltip = this.getAttribute('tooltip')\\n this.imageAlt = this.getAttribute('alt')\\n }\\n\\n /*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\n ImageWidget.prototype.refresh = function (changedTiddlers) {\\n var changedAttributes = this.computeAttributes()\\n if (\\n changedAttributes.source ||\\n changedAttributes.width ||\\n changedAttributes.height ||\\n changedAttributes.class ||\\n changedAttributes.tooltip ||\\n changedTiddlers[this.imageSource]\\n ) {\\n this.refreshSelf()\\n return true\\n } else {\\n return false\\n }\\n }\\n\\n exports.image = ImageWidget\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"module-type\": \"widget\"\n },\n \"$:/plugins/ipfs/ipfs-wiki.js\": {\n \"title\": \"$:/plugins/ipfs/ipfs-wiki.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/ipfs-wiki.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: wikimethod\\n\\nwikimethod\\n\\n\\\\*/\\n\\n/**\\n * TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n *\\n * Copyright (c) 2004-2007, Jeremy Ruston\\n * Copyright (c) 2007-2018, UnaMesa Association\\n * Copyright (c) 2019-2020, Blue Light\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are met:\\n *\\n * * Redistributions of source code must retain the above copyright notice, this\\n * list of conditions and the following disclaimer.\\n *\\n * * Redistributions in binary form must reproduce the above copyright notice,\\n * this list of conditions and the following disclaimer in the documentation\\n * and/or other materials provided with the distribution.\\n *\\n * * Neither the name of the copyright holder nor the names of its\\n * contributors may be used to endorse or promote products derived from\\n * this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n /*\\n * Parse a block of text of a specified MIME type\\n * type: content type of text to be parsed\\n * text: text\\n * options: see below\\n * Options include:\\n * parseAsInline: if true, the text of the tiddler will be parsed as an inline run\\n * _canonical_uri: optional string of the canonical URI of this content\\n */\\n exports.parseText = function (type, text, options) {\\n text = text || ''\\n options = options || {}\\n // Select a parser\\n var Parser = $tw.Wiki.parsers[type]\\n if (!Parser && $tw.utils.getFileExtensionInfo(type)) {\\n Parser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type]\\n }\\n if (!Parser) {\\n Parser = $tw.Wiki.parsers[options.defaultType || 'text/vnd.tiddlywiki']\\n }\\n if (!Parser) {\\n return null\\n }\\n // Return the parser instance\\n return new Parser(type, text, {\\n parseAsInline: options.parseAsInline,\\n wiki: this,\\n _canonical_uri: options._canonical_uri,\\n tiddler: options.tiddler\\n })\\n }\\n\\n /*\\n * Parse a tiddler according to its MIME type\\n */\\n exports.parseTiddler = function (title, options) {\\n options = $tw.utils.extend({}, options)\\n var cacheType = options.parseAsInline ? 'inlineParseTree' : 'blockParseTree'\\n var tiddler = this.getTiddler(title)\\n var self = this\\n return tiddler\\n ? this.getCacheForTiddler(title, cacheType, function () {\\n if (tiddler.hasField('_canonical_uri')) {\\n options._canonical_uri = tiddler.fields._canonical_uri\\n }\\n options.tiddler = tiddler\\n return self.parseText(\\n tiddler.fields.type,\\n tiddler.fields.text,\\n options\\n )\\n })\\n : null\\n }\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"wikimethod\"\n },\n \"$:/core/ui/ControlPanel/Saving/General\": {\n \"title\": \"$:/core/ui/ControlPanel/Saving/General\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/tags/ControlPanel/Saving\",\n \"caption\": \"{{$:/language/ControlPanel/Saving/General/Caption}}\",\n \"list-before\": \"\",\n \"text\": \"\\\\define lingo-base() $:/language/ControlPanel/Settings/\\n\\n\\\\define ipfs-saver()\\n\u003C$text text=\u003C\u003Cipfs-info-saver \\\"$(currentTiddler)$\\\">>/>\\n\\\\end\\n\\n{{$:/language/ControlPanel/Saving/General/Hint}}\\n\\n!! \u003C$link to=\\\"$:/config/PreferredSaver\\\">\u003C\u003Clingo PreferredSaver/Caption>>\u003C/$link>\\n\\n\u003C$select tiddler=\\\"$:/config/PreferredSaver\\\">\\n\u003C$list filter=\\\"[savers[]]\\\">\\n\u003Coption value=\u003C\u003CcurrentTiddler>>>\u003C\u003Cipfs-saver>>\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\\n\\n!! \u003C$link to=\\\"$:/config/AutoSave\\\">\u003C\u003Clingo AutoSave/Caption>>\u003C/$link>\\n\\n\u003C\u003Clingo AutoSave/Hint>>\\n\\n\u003C$radio tiddler=\\\"$:/config/AutoSave\\\" value=\\\"yes\\\"> \u003C\u003Clingo AutoSave/Enabled/Description>> \u003C/$radio>\\n\\n\u003C$radio tiddler=\\\"$:/config/AutoSave\\\" value=\\\"no\\\"> \u003C\u003Clingo AutoSave/Disabled/Description>> \u003C/$radio>\\n\"\n },\n \"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\": {\n \"title\": \"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\",\n \"modified\": \"20200528094915385\",\n \"text\": \"\\\\define config-title()\\n$(config-base)$$(currentTiddler)$\\n\\\\end\\n\\n\u003C$draggable tiddler=\u003C\u003CcurrentTiddler>>>\\n\u003C$checkbox tiddler=\u003C\u003Cconfig-title>> field=\\\"text\\\" checked=\\\"show\\\" unchecked=\\\"hide\\\" default=\\\"show\\\"/> \u003Cspan class=\\\"tc-icon-wrapper tc-icon-ipfs-wrapper\\\"> \u003C$transclude field=\\\"caption\\\"/> \u003Ci class=\\\"tc-muted\\\">-- \u003C$transclude field=\\\"description\\\"/>\u003C/i>\u003C/span>\\n\u003C/$draggable>\\n\"\n },\n \"$:/core/ui/EditTemplate/body\": {\n \"title\": \"$:/core/ui/EditTemplate/body\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/tags/EditTemplate\",\n \"text\": \"\\\\define lingo-base() $:/language/EditTemplate/Body/\\n\\\\define config-visibility-title()\\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\\n\\\\end\\n\\n\u003C$list filter=\\\"[all[current]has[_canonical_uri]]\\\">\\n \u003Cdiv class=\\\"tc-message-box\\\">\\n \u003C\u003Clingo External/Hint>>\\n \u003Cp>\u003C$ipfslink field=\\\"_canonical_uri\\\" tiddler=\u003C\u003CcurrentTiddler>>/>\u003C/p>\\n \u003C/div>\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[all[current]!has[_canonical_uri]]\\\">\\n \u003C$reveal state=\\\"$:/state/showeditpreview\\\" type=\\\"match\\\" text=\\\"yes\\\">\\n \u003Cdiv class=\\\"tc-tiddler-preview\\\">\\n \u003C$transclude tiddler=\\\"$:/core/ui/EditTemplate/body/editor\\\" mode=\\\"inline\\\"/>\\n \u003Cdiv class=\\\"tc-tiddler-preview-preview\\\">\\n \u003C$transclude tiddler={{$:/state/editpreviewtype}} mode=\\\"inline\\\">\\n \u003C$transclude tiddler=\\\"$:/core/ui/EditTemplate/body/preview/output\\\" mode=\\\"inline\\\"/>\\n \u003C/$transclude>\\n \u003C/div>\\n \u003C/div>\\n \u003C/$reveal>\\n \u003C$reveal state=\\\"$:/state/showeditpreview\\\" type=\\\"nomatch\\\" text=\\\"yes\\\">\\n \u003C$transclude tiddler=\\\"$:/core/ui/EditTemplate/body/editor\\\" mode=\\\"inline\\\"/>\\n \u003C/$reveal>\\n\u003C/$list>\"\n },\n \"$:/core/ui/EditTemplate/fields\": {\n \"title\": \"$:/core/ui/EditTemplate/fields\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/tags/EditTemplate\",\n \"text\": \"\\\\define lingo-base() $:/language/EditTemplate/\\n\\\\define config-title()\\n$:/config/EditTemplateFields/Visibility/$(currentField)$\\n\\\\end\\n\\n\\\\define config-filter()\\n[[hide]] -[title{$(config-title)$}]\\n\\\\end\\n\\n\\\\define current-tiddler-new-field-selector()\\n[data-tiddler-title=\\\"$(currentTiddlerCSSescaped)$\\\"] .tc-edit-field-add-name input\\n\\\\end\\n\\n\\\\define new-field-actions()\\n\u003C$action-sendmessage $message=\\\"tm-add-field\\\" $name={{{ [\u003CnewFieldNameTiddler>get[text]] }}} $value={{{ [\u003CnewFieldValueTiddler>get[text]] }}}/>\\n\u003C$action-deletetiddler $tiddler=\u003C\u003CnewFieldNameTiddler>>/>\\n\u003C$action-deletetiddler $tiddler=\u003C\u003CnewFieldValueTiddler>>/>\\n\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\u003C\u003Ccurrent-tiddler-new-field-selector>>/>\\n\\\\end\\n\\n\\\\define new-field()\\n\u003C$vars name={{{ [\u003CnewFieldNameTiddler>get[text]] }}}>\\n\u003C$reveal type=\\\"nomatch\\\" text=\\\"\\\" default=\u003C\u003Cname>>>\\n\u003C$button tooltip=\u003C\u003Clingo Fields/Add/Button/Hint>>>\\n\u003C$action-sendmessage $message=\\\"tm-add-field\\\"\\n$name=\u003C\u003Cname>>\\n$value={{{ [\u003CnewFieldValueTiddler>get[text]] }}}/>\\n\u003C$action-deletetiddler $tiddler=\u003C\u003CnewFieldNameTiddler>>/>\\n\u003C$action-deletetiddler $tiddler=\u003C\u003CnewFieldValueTiddler>>/>\\n\u003C\u003Clingo Fields/Add/Button>>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" text=\\\"\\\" default=\u003C\u003Cname>>>\\n\u003C$button>\\n\u003C\u003Clingo Fields/Add/Button>>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/$vars>\\n\\\\end\\n\\\\whitespace trim\\n\\n\u003Cdiv class=\\\"tc-edit-fields\\\">\\n\u003Ctable class=\\\"tc-edit-fields\\\">\\n\u003Ctbody>\\n\u003C$list filter=\\\"[all[current]fields[]] +[sort[title]]\\\" variable=\\\"currentField\\\" storyview=\\\"pop\\\">\\n\u003C$list filter=\u003C\u003Cconfig-filter>> variable=\\\"temp\\\">\\n\u003Ctr class=\\\"tc-edit-field\\\">\\n\u003Ctd class=\\\"tc-edit-field-name\\\">\\n\u003C$ipfslink value=\u003C\u003CcurrentField>> field=\u003C\u003CcurrentField>> tiddler=\u003C\u003CcurrentTiddler>>/>\\n\u003C/td>\\n\u003Ctd class=\\\"tc-edit-field-value\\\">\\n\u003C$edit-text tiddler=\u003C\u003CcurrentTiddler>> field=\u003C\u003CcurrentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}}/>\\n\u003C/td>\\n\u003Ctd class=\\\"tc-edit-field-remove\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\\n\u003C$action-deletefield $field=\u003C\u003CcurrentField>>/>\\n{{$:/core/images/delete-button}}\\n\u003C/$button>\\n\u003C/td>\\n\u003C/tr>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/tbody>\\n\u003C/table>\\n\u003C/div>\\n\\n\u003C$fieldmangler>\\n\u003Cdiv class=\\\"tc-edit-field-add\\\">\\n\u003Cem class=\\\"tc-edit\\\">\\n\u003C\u003Clingo Fields/Add/Prompt>>  \\n\u003C/em>\\n\u003Cspan class=\\\"tc-edit-field-add-name\\\">\\n\u003C$edit-text tiddler=\u003C\u003CnewFieldNameTiddler>> tag=\\\"input\\\" default=\\\"\\\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=\u003C\u003Cqualify \\\"$:/state/popup/field-dropdown\\\">> class=\\\"tc-edit-texteditor tc-popup-handle\\\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}}/>\\n\u003C/span> \\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/field-dropdown\\\">> class=\\\"tc-btn-invisible tc-btn-dropdown\\\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}\u003C/$button> \\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/field-dropdown\\\">> type=\\\"nomatch\\\" text=\\\"\\\" default=\\\"\\\">\\n\u003Cdiv class=\\\"tc-block-dropdown tc-edit-type-dropdown\\\">\\n\u003C$set name=\\\"tv-show-missing-links\\\" value=\\\"yes\\\">\\n\u003C$linkcatcher to=\u003C\u003CnewFieldNameTiddler>>>\\n\u003Cdiv class=\\\"tc-dropdown-item\\\">\\n\u003C\u003Clingo Fields/Add/Dropdown/User>>\\n\u003C/div>\\n\u003C$set name=\\\"newFieldName\\\" value={{{ [\u003CnewFieldNameTiddler>get[text]] }}}>\\n\u003C$list filter=\\\"[!is[shadow]!is[system]fields[]search:title\u003CnewFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\\\" variable=\\\"currentField\\\">\\n\u003C$link to=\u003C\u003CcurrentField>>>\\n\u003C$text text=\u003C\u003CcurrentField>>/>\\n\u003C/$link>\\n\u003C/$list>\\n\u003Cdiv class=\\\"tc-dropdown-item\\\">\\n\u003C\u003Clingo Fields/Add/Dropdown/System>>\\n\u003C/div>\\n\u003C$list filter=\\\"[fields[]search:title\u003CnewFieldName>sort[]] -[!is[shadow]!is[system]fields[]]\\\" variable=\\\"currentField\\\">\\n\u003C$link to=\u003C\u003CcurrentField>>>\\n\u003C$text text=\u003C\u003CcurrentField>>/>\\n\u003C/$link>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$linkcatcher>\\n\u003C/$set>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003Cspan class=\\\"tc-edit-field-add-value\\\">\\n\u003C$set name=\\\"currentTiddlerCSSescaped\\\" value={{{ [\u003CcurrentTiddler>escapecss[]] }}}>\\n\u003C$keyboard key=\\\"((add-field))\\\" actions=\u003C\u003Cnew-field-actions>>>\\n\u003C$edit-text tiddler=\u003C\u003CnewFieldValueTiddler>> tag=\\\"input\\\" default=\\\"\\\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\\\"tc-edit-texteditor\\\" tabindex={{$:/config/EditTabIndex}}/>\\n\u003C/$keyboard>\\n\u003C/$set>\\n\u003C/span> \\n\u003Cspan class=\\\"tc-edit-field-add-button\\\">\\n\u003C$macrocall $name=\\\"new-field\\\"/>\\n\u003C/span>\\n\u003C/div>\\n\u003C/$fieldmangler>\"\n },\n \"$:/core/ui/EditTemplate\": {\n \"title\": \"$:/core/ui/EditTemplate\",\n \"modified\": \"20200528094915385\",\n \"text\": \"\\\\define save-tiddler-actions()\\n\u003C$action-sendmessage $message=\\\"tm-add-tag\\\" $param={{{ [\u003CnewTagNameTiddler>get[text]] }}}/>\\n\u003C$action-deletetiddler $tiddler=\u003C\u003CnewTagNameTiddler>>/>\\n\u003C$action-sendmessage $message=\\\"tm-add-field\\\" $name={{{ [\u003CnewFieldNameTiddler>get[text]] }}} $value={{{ [\u003CnewFieldValueTiddler>get[text]] }}}/>\\n\u003C$action-deletetiddler $tiddler=\u003C\u003CnewFieldNameTiddler>>/>\\n\u003C$action-deletetiddler $tiddler=\u003C\u003CnewFieldValueTiddler>>/>\\n\u003C$action-sendmessage $message=\\\"tm-save-tiddler\\\"/>\\n\\\\end\\n\u003Cdiv data-tiddler-title=\u003C\u003CcurrentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-edit-frame [\u003CcurrentTiddler>is[tiddler]then[tc-tiddler-exists]] [\u003CcurrentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [\u003CcurrentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [\u003CcurrentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [\u003CcurrentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}>\\n\u003C$fieldmangler>\\n\u003C$vars storyTiddler=\u003C\u003CcurrentTiddler>> newTagNameTiddler=\u003C\u003Cqualify \\\"$:/temp/NewTagName\\\">> newFieldNameTiddler=\u003C\u003Cqualify \\\"$:/temp/NewFieldName\\\">> newFieldValueTiddler=\u003C\u003Cqualify \\\"$:/temp/NewFieldValue\\\">>>\\n\u003C$keyboard key=\\\"((cancel-edit-tiddler))\\\" message=\\\"tm-cancel-tiddler\\\">\\n\u003C$keyboard key=\\\"((save-tiddler))\\\" actions=\u003C\u003Csave-tiddler-actions>>>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]list[$:/tags/EditTemplate]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" filter=\\\"[\u003Ctv-config-toolbar-class>] [\u003ClistItem>encodeuricomponent[]addprefix[tc-btn-]]\\\">\\n\u003C$transclude tiddler=\u003C\u003ClistItem>>/>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\u003C/$vars>\\n\u003C/$fieldmangler>\\n\u003C/div>\"\n },\n \"$:/core/ui/SideBar/Tools\": {\n \"title\": \"$:/core/ui/SideBar/Tools\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/SideBar\",\n \"caption\": \"{{$:/language/SideBar/Tools/Caption}}\",\n \"text\": \"\\\\define lingo-base() $:/language/ControlPanel/\\n\\\\define config-title()\\n$:/config/PageControlButtons/Visibility/$(listItem)$\\n\\\\end\\n\\n\u003C\u003Clingo Basics/Version/Prompt>> \u003Cb>\u003C\u003Cversion>>\u003C/b>, \u003C\u003Clingo Ipfs/Version/Prompt>> \u003Cb>\u003C\u003Cipfs-plugin-version>>\u003C/b>\\n\\n\u003C$set name=\\\"tv-config-toolbar-icons\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-text\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" value=\\\"\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\\n\u003Cdiv style=\\\"position:relative;\\\" class={{{ [\u003ClistItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>\\n\\n\u003C$checkbox tiddler=\u003C\u003Cconfig-title>> field=\\\"text\\\" checked=\\\"show\\\" unchecked=\\\"hide\\\" default=\\\"show\\\"/> \u003C$transclude tiddler=\u003C\u003ClistItem>>/> \u003Ci class=\\\"tc-muted\\\">\u003C$transclude tiddler=\u003C\u003ClistItem>> field=\\\"description\\\"/>\u003C/i>\\n\\n\u003C/div>\\n\\n\u003C/$list>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\"\n },\n \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption\": {\n \"title\": \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"show\"\n },\n \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home\": {\n \"title\": \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"show\"\n },\n \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/ipfs/pin\": {\n \"title\": \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/ipfs/pin\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"hide\"\n },\n \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/ipfs/unpin\": {\n \"title\": \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/ipfs/unpin\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"hide\"\n },\n \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/ipfs/console/mobile\": {\n \"title\": \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/ipfs/console/mobile\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"show\"\n },\n \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions\": {\n \"title\": \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"show\"\n },\n \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/ens/publish\": {\n \"title\": \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/ens/publish\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"hide\"\n },\n \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/ipns/publish\": {\n \"title\": \"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/ipns/publish\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"hide\"\n },\n \"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/ipfs/export\": {\n \"title\": \"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/ipfs/export\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"hide\"\n },\n \"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/ipfs/export/content\": {\n \"title\": \"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/ipfs/export/content\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"hide\"\n },\n \"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/ipfs/export/attachment\": {\n \"title\": \"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/ipfs/export/attachment\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"hide\"\n },\n \"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/ipfs/refresh\": {\n \"title\": \"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/ipfs/refresh\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"hide\"\n },\n \"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/ipfs/tiddler/pin\": {\n \"title\": \"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/ipfs/tiddler/pin\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"hide\"\n },\n \"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/ipfs/tiddler/unpin\": {\n \"title\": \"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/ipfs/tiddler/unpin\",\n \"modified\": \"20200529094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"hide\"\n },\n \"$:/plugins/ipfs/ens-action.js\": {\n \"title\": \"$:/plugins/ipfs/ens-action.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/ens-action.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: library\\n\\nENS Action\\n\\n\\\\*/\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n const fileProtocol = 'file:'\\n\\n const name = 'ens-action'\\n\\n var EnsAction = function () {\\n this.once = false\\n }\\n\\n EnsAction.prototype.getLogger = function () {\\n return window.log.getLogger(name)\\n }\\n\\n EnsAction.prototype.init = function () {\\n // Init once\\n if (this.once) {\\n return\\n }\\n const self = this\\n $tw.rootWidget.addEventListener('tm-ens-manager-open', function (event) {\\n return self.handleOpenEnsManager(event)\\n })\\n $tw.rootWidget.addEventListener('tm-ens-resolve-and-open', async function (\\n event\\n ) {\\n return await self.handleResolveEnsAndOpen(event)\\n })\\n $tw.rootWidget.addEventListener('tm-ens-publish', async function (event) {\\n return await self.handlePublishToEns(event)\\n })\\n // Init once\\n this.once = true\\n }\\n\\n EnsAction.prototype.handleOpenEnsManager = function (event) {\\n // Retrieve ENS domain\\n const ensDomain = $tw.utils.getIpfsEnsDomain()\\n // Check\\n if (ensDomain == null) {\\n window.open('https://app.ens.domains', '_blank', 'noopener,noreferrer')\\n } else {\\n window.open(\\n `https://app.ens.domains/name/${ensDomain}`,\\n '_blank',\\n 'noopener,noreferrer'\\n )\\n }\\n return true\\n }\\n\\n EnsAction.prototype.handleResolveEnsAndOpen = async function (event) {\\n const ensDomain = $tw.utils.getIpfsEnsDomain()\\n if (ensDomain == null) {\\n $tw.utils.alert(name, 'Undefined ENS domain...')\\n return false\\n }\\n try {\\n this.getLogger().info(`ENS domain: ${ensDomain}`)\\n const { resolvedUrl } = await $tw.ipfs.resolveEns(ensDomain)\\n if (resolvedUrl !== null) {\\n window.open(resolvedUrl.toString(), '_blank', 'noopener,noreferrer')\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return false\\n }\\n return true\\n }\\n\\n EnsAction.prototype.handlePublishToEns = async function (event) {\\n const self = this\\n const wiki = $tw.ipfs.getDocumentUrl()\\n if (wiki.protocol === fileProtocol) {\\n $tw.utils.alert(name, 'Undefined IPFS identifier...')\\n return false\\n }\\n if (wiki.pathname === '/') {\\n $tw.utils.alert(name, 'Unknown IPFS identifier...')\\n return false\\n }\\n var cid = null\\n var ensCid = null\\n var ensResolvedUrl = null\\n var ipnsKey = null\\n try {\\n var { cid, ipnsKey } = await $tw.ipfs.resolveUrl(true, false, wiki)\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return false\\n }\\n const ensDomain = $tw.utils.getIpfsEnsDomain()\\n if (ensDomain == null) {\\n $tw.utils.alert(name, 'Undefined ENS domain...')\\n return false\\n }\\n if (cid == null && ipnsKey !== null) {\\n $tw.utils.alert(name, 'Nothing to publish to ENS...')\\n return false\\n }\\n try {\\n var {\\n cid: ensCid,\\n resolvedUrl: ensResolvedUrl\\n } = await $tw.ipfs.resolveUrl(false, true, ensDomain)\\n if (cid !== null && ensCid !== null && cid === ensCid) {\\n $tw.utils.alert(\\n name,\\n 'The current resolved ENS domain content is up to date...'\\n )\\n return false\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return false\\n }\\n if (cid !== null) {\\n $tw.utils.alert(name, `Publishing to ENS: ${ensDomain}`)\\n $tw.ipfs\\n .requestToUnpin(ensCid)\\n .then(data => {\\n if (data) {\\n $tw.ipfs.removeFromPinUnpin(ensCid, ensResolvedUrl)\\n }\\n $tw.ipfs\\n .setEns(ensDomain, cid)\\n .then(data => {\\n $tw.utils.alert(name, 'Successfully published to ENS...')\\n })\\n .catch(error => {\\n $tw.ipfs.requestToPin(ensCid)\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n } else if (ipnsKey !== null) {\\n $tw.utils.alert(name, `Publishing to ENS: ${ensDomain}`)\\n $tw.ipfs\\n .resolveUrl(true, false, wiki)\\n .then(data => {\\n const { cid: ipnsCid } = data\\n $tw.ipfs\\n .requestToUnpin(ensCid)\\n .then(data => {\\n if (data) {\\n $tw.ipfs.removeFromPinUnpin(ensCid, ensResolvedUrl)\\n }\\n $tw.ipfs\\n .setEns(ensDomain, ipnsCid)\\n .then(data => {\\n $tw.utils.alert(name, 'Successfully Published to ENS...')\\n })\\n .catch(error => {\\n $tw.ipfs.requestToPin(ensCid)\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n }\\n return true\\n }\\n\\n exports.EnsAction = EnsAction\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"library\"\n },\n \"$:/plugins/ipfs/ens-wrapper.js\": {\n \"title\": \"$:/plugins/ipfs/ens-wrapper.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/ens-wrapper.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: library\\n\\nENS Wrapper\\n\\n\\\\*/\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n /**\\n * https://github.com/purposeindustries/window-or-global\\n * The MIT License (MIT) Copyright (c) Purpose Industries\\n * version: 1.0.1\\n */\\n const root =\\n (typeof self === 'object' && self.self === self && self) ||\\n (typeof global === 'object' && global.global === global && global) ||\\n this\\n\\n const name = 'ens-wrapper'\\n\\n var EnsWrapper = function (ipfsBundle) {\\n this.account = null\\n this.chainId = null\\n this.ethereum = null\\n this.provider = null\\n this.web3 = null\\n this.ipfsBundle = ipfsBundle\\n this.ensLibrary = ipfsBundle.ensLibrary\\n }\\n\\n EnsWrapper.prototype.getLogger = function () {\\n return root.log.getLogger(name)\\n }\\n\\n EnsWrapper.prototype.getChainId = function () {\\n return this.chainId\\n }\\n\\n EnsWrapper.prototype.getEthereumProvider = function () {\\n if (this.ethereum == null) {\\n const self = this\\n this.ethereum = this.ensLibrary.getProvider()\\n // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md\\n this.ethereum.on('accountsChanged', function accountChanged (accounts) {\\n self.accountChanged(accounts)\\n })\\n this.ethereum.on('chainChanged', function networkChanged (chainId) {\\n self.networkChanged(chainId)\\n })\\n this.ethereum.on('close', function closeProvider (code, reason) {\\n self.closeConnection(code, reason)\\n })\\n this.ethereum.on('networkChanged', function networkChanged (chainId) {\\n self.networkChanged(chainId)\\n })\\n }\\n return this.ethereum\\n }\\n\\n EnsWrapper.prototype.accountChanged = async function (accounts) {\\n if (\\n accounts === undefined ||\\n accounts == null ||\\n Array.isArray(accounts) === false ||\\n accounts.length === 0\\n ) {\\n this.web3 = null\\n this.chainId = null\\n this.account = null\\n this.getLogger().info('Closing Ethereum connection...')\\n } else if (this.account !== accounts[0]) {\\n try {\\n if (this.web3 == null && this.chainId == null) {\\n const { web3, chainId } = await this.getWeb3Provider()\\n this.web3 = web3\\n this.chainId = chainId\\n }\\n this.account = accounts[0]\\n const etherscan = this.getEtherscanRegistry()\\n this.getLogger().info(\\n `Current Ethereum account:\\\\n ${etherscan[this.chainId]}/address/${\\n this.account\\n }`\\n )\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n }\\n }\\n }\\n\\n EnsWrapper.prototype.closeConnection = function (code, reason) {\\n this.web3 = null\\n this.chainId = null\\n this.account = null\\n this.getLogger().info(\\n `Closing Ethereum Connection:\\\\n Reason: ${reason}\\\\n Code: ${code}`\\n )\\n }\\n\\n EnsWrapper.prototype.networkChanged = function (chainId) {\\n if (this.chainId !== chainId) {\\n const network = this.getNetwork()\\n try {\\n this.web3 = null\\n this.chainId = chainId\\n this.account = null\\n this.getLogger().info(`Current Ethereum network:\\\\n ${network[chainId]}`)\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n }\\n }\\n }\\n\\n EnsWrapper.prototype.getEnabledWeb3Provider = async function () {\\n var web3 = null\\n var chainId = null\\n var account = null\\n const provider = this.getEthereumProvider()\\n const network = this.getNetwork()\\n const etherscan = this.getEtherscanRegistry()\\n var msg = 'Reuse Web3 provider:'\\n if (this.account == null) {\\n try {\\n var {\\n web3,\\n chainId,\\n account\\n } = await this.ensLibrary.getEnabledWeb3Provider(provider)\\n } catch (error) {\\n this.getLogger().error(error)\\n throw new Error('Unable to retrieve an enabled Ethereum provider...')\\n }\\n this.web3 = web3\\n this.chainId = chainId\\n this.account = account\\n msg = 'New Web3 provider:'\\n }\\n // Log\\n this.getLogger().info(\\n `${msg}\\\\n network: ${network[this.chainId]}\\\\n account: ${\\n etherscan[this.chainId]\\n }/address/${this.account}`\\n )\\n return {\\n web3: this.web3,\\n chainId: this.chainId,\\n account: this.account\\n }\\n }\\n\\n EnsWrapper.prototype.getWeb3Provider = async function () {\\n var web3 = null\\n var chainId = null\\n const provider = this.getEthereumProvider()\\n const network = this.getNetwork()\\n var info = 'Reuse Web3 provider:'\\n if (this.web3 == null) {\\n try {\\n var { web3, chainId } = await this.ensLibrary.getWeb3Provider(provider)\\n } catch (error) {\\n this.getLogger().error(error)\\n throw new Error('Unable to retrieve an Ethereum provider...')\\n }\\n this.web3 = web3\\n this.chainId = chainId\\n info = 'New Web3 provider:'\\n }\\n // Log\\n this.getLogger().info(`${info}\\\\n network: ${network[this.chainId]}`)\\n return {\\n web3: this.web3,\\n chainId: this.chainId\\n }\\n }\\n\\n EnsWrapper.prototype.getContentHash = async function (domain, web3) {\\n try {\\n var { content, protocol } = await this.ensLibrary.getContentHash(\\n domain,\\n web3\\n )\\n if (content !== null && protocol !== null) {\\n // Convert CidV0 to CidV1\\n content = this.ipfsBundle.cidV0ToCidV1(content)\\n // Success\\n return {\\n content: content,\\n protocol: protocol\\n }\\n }\\n $tw.utils.alert(name, 'Unassigned ENS domain content...')\\n return {\\n content: null,\\n protocol: null\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n throw new Error('Unable to fetch ENS domain content...')\\n }\\n }\\n\\n EnsWrapper.prototype.setContentHash = async function (\\n domain,\\n cid,\\n web3,\\n account\\n ) {\\n try {\\n const isOwner = await this.ensLibrary.isOwner(domain, web3, account)\\n if (isOwner === false) {\\n const error = new Error(\\n 'Unauthorized Owner. Unable to set ENS domain content...'\\n )\\n error.name = 'OwnerError'\\n throw error\\n }\\n const cidV0 = this.ipfsBundle.cidV1ToCidV0(cid)\\n await this.ensLibrary.setContentHash(domain, cidV0, web3, account)\\n return {\\n cidV0: cidV0\\n }\\n } catch (error) {\\n if (error.name === 'OwnerError') {\\n throw error\\n }\\n this.getLogger().error(error)\\n throw new Error('Unable to set ENS domain content...')\\n }\\n }\\n\\n EnsWrapper.prototype.getEtherscanRegistry = function () {\\n return this.ensLibrary.getEtherscanRegistry()\\n }\\n\\n EnsWrapper.prototype.getNetwork = function () {\\n return this.ensLibrary.getNetwork()\\n }\\n\\n EnsWrapper.prototype.getENSRegistry = function () {\\n return this.ensLibrary.getENSRegistry()\\n }\\n\\n exports.EnsWrapper = EnsWrapper\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"library\"\n },\n \"$:/plugins/ipfs/loglevel/loglevel.js\": {\n \"text\": \"/*\\n* loglevel - https://github.com/pimterry/loglevel\\n*\\n* Copyright (c) 2013 Tim Perry\\n* Licensed under the MIT license.\\n*/\\n(function (root, definition) {\\n \\\"use strict\\\";\\n if (typeof define === 'function' && define.amd) {\\n define(definition);\\n } else if (typeof module === 'object' && module.exports) {\\n module.exports = definition();\\n } else {\\n root.log = definition();\\n }\\n}(this, function () {\\n \\\"use strict\\\";\\n\\n // Slightly dubious tricks to cut down minimized file size\\n var noop = function() {};\\n var undefinedType = \\\"undefined\\\";\\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\\n /Trident\\\\/|MSIE /.test(window.navigator.userAgent)\\n );\\n\\n var logMethods = [\\n \\\"trace\\\",\\n \\\"debug\\\",\\n \\\"info\\\",\\n \\\"warn\\\",\\n \\\"error\\\"\\n ];\\n\\n // Cross-browser bind equivalent that works at least back to IE6\\n function bindMethod(obj, methodName) {\\n var method = obj[methodName];\\n if (typeof method.bind === 'function') {\\n return method.bind(obj);\\n } else {\\n try {\\n return Function.prototype.bind.call(method, obj);\\n } catch (e) {\\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\\n return function() {\\n return Function.prototype.apply.apply(method, [obj, arguments]);\\n };\\n }\\n }\\n }\\n\\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\\n function traceForIE() {\\n if (console.log) {\\n if (console.log.apply) {\\n console.log.apply(console, arguments);\\n } else {\\n // In old IE, native console methods themselves don't have apply().\\n Function.prototype.apply.apply(console.log, [console, arguments]);\\n }\\n }\\n if (console.trace) console.trace();\\n }\\n\\n // Build the best logging method possible for this env\\n // Wherever possible we want to bind, not wrap, to preserve stack traces\\n function realMethod(methodName) {\\n if (methodName === 'debug') {\\n methodName = 'log';\\n }\\n\\n if (typeof console === undefinedType) {\\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\\n } else if (methodName === 'trace' && isIE) {\\n return traceForIE;\\n } else if (console[methodName] !== undefined) {\\n return bindMethod(console, methodName);\\n } else if (console.log !== undefined) {\\n return bindMethod(console, 'log');\\n } else {\\n return noop;\\n }\\n }\\n\\n // These private functions always need `this` to be set properly\\n\\n function replaceLoggingMethods(level, loggerName) {\\n /*jshint validthis:true */\\n for (var i = 0; i \u003C logMethods.length; i++) {\\n var methodName = logMethods[i];\\n this[methodName] = (i \u003C level) ?\\n noop :\\n this.methodFactory(methodName, level, loggerName);\\n }\\n\\n // Define log.log as an alias for log.debug\\n this.log = this.debug;\\n }\\n\\n // In old IE versions, the console isn't present until you first open it.\\n // We build realMethod() replacements here that regenerate logging methods\\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\\n return function () {\\n if (typeof console !== undefinedType) {\\n replaceLoggingMethods.call(this, level, loggerName);\\n this[methodName].apply(this, arguments);\\n }\\n };\\n }\\n\\n // By default, we use closely bound real methods wherever possible, and\\n // otherwise we wait for a console to appear, and then try again.\\n function defaultMethodFactory(methodName, level, loggerName) {\\n /*jshint validthis:true */\\n return realMethod(methodName) ||\\n enableLoggingWhenConsoleArrives.apply(this, arguments);\\n }\\n\\n function Logger(name, defaultLevel, factory) {\\n var self = this;\\n var currentLevel;\\n var storageKey = \\\"loglevel\\\";\\n if (name) {\\n storageKey += \\\":\\\" + name;\\n }\\n\\n function persistLevelIfPossible(levelNum) {\\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\\n\\n if (typeof window === undefinedType) return;\\n\\n // Use localStorage if available\\n try {\\n window.localStorage[storageKey] = levelName;\\n return;\\n } catch (ignore) {}\\n\\n // Use session cookie as fallback\\n try {\\n window.document.cookie =\\n encodeURIComponent(storageKey) + \\\"=\\\" + levelName + \\\";\\\";\\n } catch (ignore) {}\\n }\\n\\n function getPersistedLevel() {\\n var storedLevel;\\n\\n if (typeof window === undefinedType) return;\\n\\n try {\\n storedLevel = window.localStorage[storageKey];\\n } catch (ignore) {}\\n\\n // Fallback to cookies if local storage gives us nothing\\n if (typeof storedLevel === undefinedType) {\\n try {\\n var cookie = window.document.cookie;\\n var location = cookie.indexOf(\\n encodeURIComponent(storageKey) + \\\"=\\\");\\n if (location !== -1) {\\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\\n }\\n } catch (ignore) {}\\n }\\n\\n // If the stored level is not valid, treat it as if nothing was stored.\\n if (self.levels[storedLevel] === undefined) {\\n storedLevel = undefined;\\n }\\n\\n return storedLevel;\\n }\\n\\n /*\\n *\\n * Public logger API - see https://github.com/pimterry/loglevel for details\\n *\\n */\\n\\n self.name = name;\\n\\n self.levels = { \\\"TRACE\\\": 0, \\\"DEBUG\\\": 1, \\\"INFO\\\": 2, \\\"WARN\\\": 3,\\n \\\"ERROR\\\": 4, \\\"SILENT\\\": 5};\\n\\n self.methodFactory = factory || defaultMethodFactory;\\n\\n self.getLevel = function () {\\n return currentLevel;\\n };\\n\\n self.setLevel = function (level, persist) {\\n if (typeof level === \\\"string\\\" && self.levels[level.toUpperCase()] !== undefined) {\\n level = self.levels[level.toUpperCase()];\\n }\\n if (typeof level === \\\"number\\\" && level >= 0 && level \u003C= self.levels.SILENT) {\\n currentLevel = level;\\n if (persist !== false) { // defaults to true\\n persistLevelIfPossible(level);\\n }\\n replaceLoggingMethods.call(self, level, name);\\n if (typeof console === undefinedType && level \u003C self.levels.SILENT) {\\n return \\\"No console available for logging\\\";\\n }\\n } else {\\n throw \\\"log.setLevel() called with invalid level: \\\" + level;\\n }\\n };\\n\\n self.setDefaultLevel = function (level) {\\n if (!getPersistedLevel()) {\\n self.setLevel(level, false);\\n }\\n };\\n\\n self.enableAll = function(persist) {\\n self.setLevel(self.levels.TRACE, persist);\\n };\\n\\n self.disableAll = function(persist) {\\n self.setLevel(self.levels.SILENT, persist);\\n };\\n\\n // Initialize with the right level\\n var initialLevel = getPersistedLevel();\\n if (initialLevel == null) {\\n initialLevel = defaultLevel == null ? \\\"WARN\\\" : defaultLevel;\\n }\\n self.setLevel(initialLevel, false);\\n }\\n\\n /*\\n *\\n * Top-level API\\n *\\n */\\n\\n var defaultLogger = new Logger();\\n\\n var _loggersByName = {};\\n defaultLogger.getLogger = function getLogger(name) {\\n if (typeof name !== \\\"string\\\" || name === \\\"\\\") {\\n throw new TypeError(\\\"You must supply a name when creating a logger.\\\");\\n }\\n\\n var logger = _loggersByName[name];\\n if (!logger) {\\n logger = _loggersByName[name] = new Logger(\\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\\n }\\n return logger;\\n };\\n\\n // Grab the current global log variable in case of overwrite\\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\\n defaultLogger.noConflict = function() {\\n if (typeof window !== undefinedType &&\\n window.log === defaultLogger) {\\n window.log = _log;\\n }\\n\\n return defaultLogger;\\n };\\n\\n defaultLogger.getLoggers = function getLoggers() {\\n return _loggersByName;\\n };\\n\\n return defaultLogger;\\n}));\\n\",\n \"type\": \"application/javascript\",\n \"title\": \"$:/plugins/ipfs/loglevel/loglevel.js\",\n \"global-module\": \"true\",\n \"module-type\": \"library\"\n },\n \"$:/plugins/ipfs/loglevel/license\": {\n \"text\": \"Copyright (c) 2013 Tim Perry\\r\\n\\r\\nPermission is hereby granted, free of charge, to any person\\r\\nobtaining a copy of this software and associated documentation\\r\\nfiles (the \\\"Software\\\"), to deal in the Software without\\r\\nrestriction, including without limitation the rights to use,\\r\\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\ncopies of the Software, and to permit persons to whom the\\r\\nSoftware is furnished to do so, subject to the following\\r\\nconditions:\\r\\n\\r\\nThe above copyright notice and this permission notice shall be\\r\\nincluded in all copies or substantial portions of the Software.\\r\\n\\r\\nTHE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND,\\r\\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\\r\\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\\r\\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\\r\\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\\r\\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\\r\\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\\r\\nOTHER DEALINGS IN THE SOFTWARE.\\r\\n\",\n \"type\": \"text/plain\",\n \"title\": \"$:/plugins/ipfs/loglevel/license\"\n },\n \"$:/plugins/ipfs/ipfs-action.js\": {\n \"title\": \"$:/plugins/ipfs/ipfs-action.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/ipfs-action.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: library\\n\\nIPFS Action\\n\\n\\\\*/\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n const fileProtocol = 'file:'\\n const ipfsKeyword = 'ipfs'\\n const ipnsKeyword = 'ipns'\\n\\n const name = 'ipfs-action'\\n\\n var IpfsAction = function () {\\n this.once = false\\n this.console = false\\n this.ipnsName = $tw.utils.getIpfsIpnsName()\\n this.ipnsKey = $tw.utils.getIpfsIpnsKey()\\n }\\n\\n IpfsAction.prototype.getLogger = function () {\\n return window.log.getLogger(name)\\n }\\n\\n IpfsAction.prototype.init = function () {\\n // Init once\\n if (this.once) {\\n return\\n }\\n const self = this\\n // Widget\\n $tw.rootWidget.addEventListener('tm-ipfs-export', async function (event) {\\n return await self.handleExportToIpfs(event, false)\\n })\\n $tw.rootWidget.addEventListener('tm-ipfs-export-content', async function (\\n event\\n ) {\\n return await self.handleExportToIpfs(event, true)\\n })\\n $tw.rootWidget.addEventListener('tm-ipns-fetch', async function (event) {\\n return await self.handleFetchIpnsKey(event)\\n })\\n $tw.rootWidget.addEventListener('tm-ipns-generate', async function (event) {\\n return await self.handleGenerateIpnsKey(event)\\n })\\n $tw.rootWidget.addEventListener('tm-console-mobile', async function (\\n event\\n ) {\\n return await self.handleMobileConsole(event)\\n })\\n $tw.rootWidget.addEventListener(\\n 'tm-ipfs-export-attachment',\\n async function (event) {\\n return await self.handleExportAttachmentToIpfs(event)\\n }\\n )\\n $tw.rootWidget.addEventListener('tm-ipns-publish', async function (event) {\\n return await self.handlePublishToIpns(event)\\n })\\n $tw.rootWidget.addEventListener('tm-ipns-remove', async function (event) {\\n return await self.handleRemoveIpnsKey(event)\\n })\\n $tw.rootWidget.addEventListener('tm-ipns-rename', async function (event) {\\n return await self.handleRenameIpnsName(event)\\n })\\n $tw.rootWidget.addEventListener('tm-ipns-resolve-and-open', async function (\\n event\\n ) {\\n return await self.handleResolveIpnsKeyAndOpen(event)\\n })\\n // Init once\\n this.once = true\\n }\\n\\n IpfsAction.prototype.handleExportToIpfs = async function (event, child) {\\n var cid = null\\n var ipnsKey = null\\n var ipnsName = null\\n var normalizedUrl = null\\n var added = null\\n var fields = []\\n const self = this\\n const title = event.tiddlerTitle\\n var tiddler = $tw.wiki.getTiddler(title)\\n var exportUri = tiddler.getFieldString('_export_uri')\\n try {\\n var { cid, ipnsKey, ipnsName, normalizedUrl } = await $tw.ipfs.resolveUrl(\\n true,\\n true,\\n exportUri\\n )\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return false\\n }\\n // Retrieve content\\n const content = await this.exportTiddler(child, exportUri, tiddler)\\n // Check\\n if (content == null) {\\n return false\\n }\\n this.getLogger().info(`Uploading Tiddler: ${content.length} bytes`)\\n try {\\n var { added } = await $tw.ipfs.addToIpfs(content)\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return false\\n }\\n // Prepare New value\\n fields.push({ key: '_export_uri', value: `/${ipfsKeyword}/${added}` })\\n var tiddler = $tw.wiki.getTiddler(title)\\n var updatedTiddler = $tw.utils.updateTiddler({\\n tiddler: tiddler,\\n addTags: ['$:/isExported', '$:/isIpfs'],\\n fields: fields\\n })\\n $tw.wiki.addTiddler(updatedTiddler)\\n if (ipnsKey !== null) {\\n $tw.utils.alert(name, `Publishing IPNS name: ${ipnsName}`)\\n $tw.ipfs\\n .pinToIpfs(added)\\n .then(data => {\\n $tw.ipfs\\n .publishIpnsName(added, ipnsKey, ipnsName)\\n .then(data => {\\n fields.push({ key: '_export_uri', value: exportUri })\\n tiddler = $tw.utils.updateTiddler({\\n tiddler: tiddler,\\n addTags: ['$:/isExported', '$:/isIpfs'],\\n fields: fields\\n })\\n $tw.wiki.addTiddler(tiddler)\\n $tw.utils.alert(\\n name,\\n `Successfully Published IPNS name: ${ipnsName}`\\n )\\n if ($tw.utils.getIpfsUnpin()) {\\n $tw.ipfs\\n .unpinFromIpfs(cid)\\n .then(data => {\\n if (data !== undefined && data !== null) {\\n $tw.ipfs.removeFromPinUnpin(cid, normalizedUrl)\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n }\\n })\\n .catch(error => {\\n $tw.ipfs.requestToUnpin(added)\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n } else if (\\n normalizedUrl !== null &&\\n normalizedUrl.hostname.endsWith('.eth')\\n ) {\\n $tw.utils.alert(name, `Publishing to ENS: ${normalizedUrl.hostname}`)\\n $tw.ipfs\\n .pinToIpfs(added)\\n .then(data => {\\n $tw.ipfs\\n .setEns(normalizedUrl.hostname, added)\\n .then(data => {\\n fields.push({ key: '_export_uri', value: exportUri })\\n tiddler = $tw.utils.updateTiddler({\\n tiddler: tiddler,\\n addTags: ['$:/isExported', '$:/isIpfs'],\\n fields: fields\\n })\\n $tw.wiki.addTiddler(tiddler)\\n $tw.utils.alert(name, 'Successfully Published to ENS...')\\n if ($tw.utils.getIpfsUnpin()) {\\n $tw.ipfs\\n .unpinFromIpfs(cid)\\n .then(data => {\\n if (data !== undefined && data !== null) {\\n $tw.ipfs.removeFromPinUnpin(cid, normalizedUrl)\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n }\\n })\\n .catch(error => {\\n $tw.ipfs.requestToUnpin(added)\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n }\\n return true\\n }\\n\\n IpfsAction.prototype.handleExportAttachmentToIpfs = async function (event) {\\n const title = event.tiddlerTitle\\n var tiddler = $tw.wiki.getTiddler(title)\\n const { type, info } = $tw.utils.getContentType(title, tiddler.fields.type)\\n var added = null\\n if (info.encoding !== 'base64' && type !== 'image/svg+xml') {\\n $tw.utils.alert(name, 'This Tiddler do not contain any Attachment...')\\n return false\\n }\\n // Do not process if _canonical_uri is set and the text field is empty\\n const canonicalUri = tiddler.getFieldString('_canonical_uri')\\n if (\\n canonicalUri !== undefined &&\\n canonicalUri !== null &&\\n canonicalUri.trim() !== ''\\n ) {\\n $tw.utils.alert(name, 'Attachment is already published...')\\n return false\\n }\\n try {\\n const content = this.getAttachmentContent(tiddler)\\n if (content == null) {\\n return false\\n }\\n this.getLogger().info(`Uploading attachment: ${content.length} bytes`)\\n var { added } = await $tw.ipfs.addToIpfs(content)\\n $tw.ipfs.requestToPin(added)\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return false\\n }\\n var addTags = []\\n var removeTags = []\\n if ($tw.crypto.hasPassword()) {\\n addTags = ['$:/isAttachment', '$:/isIpfs']\\n removeTags = ['$:/isEmbedded']\\n } else {\\n addTags = ['$:/isAttachment', '$:/isIpfs']\\n removeTags = ['$:/isEmbedded']\\n }\\n // Update\\n tiddler = $tw.utils.updateTiddler({\\n tiddler: tiddler,\\n addTags: addTags,\\n removeTags: removeTags,\\n fields: [\\n { key: 'text', value: '' },\\n { key: '_canonical_uri', value: `/${ipfsKeyword}/${added}` }\\n ]\\n })\\n $tw.wiki.addTiddler(tiddler)\\n return true\\n }\\n\\n IpfsAction.prototype.getAttachmentContent = function (tiddler) {\\n const { type, info } = $tw.utils.getContentType(\\n tiddler.fields.title,\\n tiddler.fields.type\\n )\\n if (info.encoding !== 'base64' && type !== 'image/svg+xml') {\\n $tw.utils.alert(name, 'Unsupported Tiddler Content-Type...')\\n return null\\n }\\n var text = tiddler.getFieldString('text')\\n if (text === undefined || text == null || text === '') {\\n $tw.utils.alert(name, 'Empty attachment content...')\\n return null\\n }\\n if ($tw.crypto.hasPassword()) {\\n try {\\n // https://github.com/xmaysonnave/tiddlywiki-ipfs/issues/9\\n if (info.encoding === 'base64') {\\n text = atob(text)\\n }\\n text = $tw.crypto.encrypt(text, $tw.crypto.currentPassword)\\n text = $tw.ipfs.StringToUint8Array(text)\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(\\n name,\\n 'Failed to process encrypted Attachment content...'\\n )\\n return null\\n }\\n } else {\\n try {\\n if (info.encoding === 'base64') {\\n text = $tw.ipfs.Base64ToUint8Array(text)\\n } else {\\n text = $tw.ipfs.StringToUint8Array(text)\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, 'Failed to process Attachment content...')\\n return null\\n }\\n }\\n return text\\n }\\n\\n IpfsAction.prototype.handleRenameIpnsName = async function (event) {\\n var ipnsKey = null\\n var ipnsName = $tw.utils.getIpfsIpnsName()\\n ipnsName =\\n ipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n ? null\\n : ipnsName.trim()\\n if (ipnsName == null) {\\n $tw.utils.alert(name, 'Undefined IPNS name....')\\n return false\\n }\\n if (this.ipnsName == null || this.ipnsName === ipnsName) {\\n $tw.utils.alert(name, 'Nothing to rename....')\\n return false\\n }\\n try {\\n var { ipnsKey } = await $tw.ipfs.renameIpnsName(this.ipnsName, ipnsName)\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return false\\n }\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/ipns/key')\\n if (tiddler !== undefined && this.ipnsKey !== ipnsKey) {\\n tiddler = $tw.utils.updateTiddler({\\n tiddler: tiddler,\\n fields: [{ key: 'text', value: ipnsKey }]\\n })\\n $tw.wiki.addTiddler(tiddler)\\n }\\n this.ipnsKey = ipnsKey\\n this.ipnsName = ipnsName\\n return true\\n }\\n\\n IpfsAction.prototype.handleGenerateIpnsKey = async function (event) {\\n var ipnsKey = null\\n var ipnsName = $tw.utils.getIpfsIpnsName()\\n ipnsName =\\n ipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n ? null\\n : ipnsName.trim()\\n if (ipnsName == null) {\\n $tw.utils.alert(name, 'Undefined IPNS name....')\\n return false\\n }\\n try {\\n var ipnsKey = await $tw.ipfs.generateIpnsKey(ipnsName)\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return false\\n }\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/ipns/key')\\n if (tiddler !== undefined && this.ipnsKey !== ipnsKey) {\\n tiddler = $tw.utils.updateTiddler({\\n tiddler: tiddler,\\n fields: [{ key: 'text', value: ipnsKey }]\\n })\\n $tw.wiki.addTiddler(tiddler)\\n }\\n this.ipnsKey = ipnsKey\\n this.ipnsName = ipnsName\\n return true\\n }\\n\\n IpfsAction.prototype.handleRemoveIpnsKey = async function (event) {\\n var ipnsKey = null\\n var normalizedUrl = null\\n const self = this\\n var ipnsName = $tw.utils.getIpfsIpnsName()\\n ipnsName =\\n ipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n ? null\\n : ipnsName.trim()\\n if (ipnsName == null) {\\n $tw.utils.alert(name, 'Undefined IPNS name....')\\n return false\\n }\\n try {\\n var { ipnsKey, normalizedUrl } = await $tw.ipfs.getIpnsIdentifiers(\\n ipnsName\\n )\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return false\\n }\\n // Async\\n $tw.ipfs\\n .requestToUnpin(null, ipnsKey, normalizedUrl)\\n .then(data => {\\n $tw.ipfs\\n .removeIpnsKey(ipnsName)\\n .then(data => {\\n $tw.utils.alert(name, 'Succesfully removed Ipns key....')\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/ipns/name')\\n if (tiddler !== undefined) {\\n const updatedTiddler = $tw.utils.updateTiddler({\\n tiddler: tiddler,\\n fields: [{ key: 'text', value: '' }]\\n })\\n $tw.wiki.addTiddler(updatedTiddler)\\n }\\n tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/ipns/key')\\n if (tiddler !== undefined) {\\n const updatedTiddler = $tw.utils.updateTiddler({\\n tiddler: tiddler,\\n fields: [{ key: 'text', value: '' }]\\n })\\n $tw.wiki.addTiddler(updatedTiddler)\\n }\\n this.ipnsName = null\\n this.ipnsKey = null\\n return true\\n }\\n\\n IpfsAction.prototype.handleFetchIpnsKey = async function (event) {\\n var ipnsKey = null\\n var ipnsName = $tw.utils.getIpfsIpnsName()\\n ipnsName =\\n ipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n ? null\\n : ipnsName.trim()\\n if (ipnsName == null) {\\n $tw.utils.alert(name, 'Undefined IPNS name....')\\n return false\\n }\\n try {\\n var { ipnsKey } = await $tw.ipfs.getIpnsIdentifiers(ipnsName)\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return false\\n }\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/ipns/key')\\n if (tiddler !== undefined && this.ipnsKey !== ipnsKey) {\\n tiddler = $tw.utils.updateTiddler({\\n tiddler: tiddler,\\n fields: [{ key: 'text', value: ipnsKey }]\\n })\\n $tw.wiki.addTiddler(tiddler)\\n this.ipnsKey = ipnsKey\\n }\\n this.ipnsName = ipnsName\\n return true\\n }\\n\\n IpfsAction.prototype.handleResolveIpnsKeyAndOpen = async function (event) {\\n var ipnsKey = null\\n var resolvedUrl = null\\n var ipnsName = $tw.utils.getIpfsIpnsName()\\n ipnsName =\\n ipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n ? null\\n : ipnsName.trim()\\n if (ipnsName == null) {\\n $tw.utils.alert(name, 'Undefined IPNS name....')\\n return false\\n }\\n try {\\n var { ipnsKey, resolvedUrl } = await $tw.ipfs.resolveUrl(\\n true,\\n false,\\n `/${ipnsKeyword}/${ipnsName}`\\n )\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return false\\n }\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/ipns/key')\\n if (tiddler !== undefined && this.ipnsKey !== ipnsKey) {\\n tiddler = $tw.utils.updateTiddler({\\n tiddler: tiddler,\\n fields: [{ key: 'text', value: ipnsKey }]\\n })\\n this.ipnsKey = ipnsKey\\n $tw.wiki.addTiddler(tiddler)\\n }\\n this.ipnsName = ipnsName\\n window.open(resolvedUrl.toString(), '_blank', 'noopener,noreferrer')\\n return true\\n }\\n\\n IpfsAction.prototype.handleMobileConsole = async function (tiddler) {\\n // Load mobile console if applicable\\n if (typeof window.eruda === 'undefined') {\\n try {\\n // Load eruda\\n await $tw.ipfs.ipfsBundle.ipfsLoader.loadErudaLibrary()\\n } catch (error) {\\n this.getLogger().error(error)\\n throw new Error(error.message)\\n }\\n const erudaContainer = window.document.createElement('div')\\n window.document.body.appendChild(erudaContainer)\\n window.eruda.init({\\n container: erudaContainer,\\n tool: ['console'],\\n useShadowDom: true,\\n autoScale: true\\n })\\n // Inherit font\\n erudaContainer.style.fontFamily = 'inherit'\\n // Preserve user preference if any, default is 80\\n if (window.eruda.get().config.get('displaySize') === 80) {\\n window.eruda.get().config.set('displaySize', 40)\\n }\\n // Preserve user preference if any, default is 0.95\\n if (window.eruda.get().config.get('transparency') === 0.95) {\\n window.eruda.get().config.set('transparency', 1)\\n }\\n // Hide Eruda button\\n if (window.eruda._shadowRoot !== undefined) {\\n const btn = window.eruda._shadowRoot.querySelector('.eruda-entry-btn')\\n if (btn !== undefined) {\\n btn.style.display = 'none'\\n }\\n }\\n // Console settings\\n const console = window.eruda.get('console')\\n console.config.set('asyncRender', true)\\n console.config.set('catchGlobalErr', true)\\n console.config.set('displayExtraInfo', false)\\n console.config.set('displayGetterVal', true)\\n console.config.set('displayUnenumerable', true)\\n console.config.set('jsExecution', true)\\n console.config.set('maxLogNum', 'infinite')\\n console.config.set('overrideConsole', true)\\n this.getLogger().info('Mobile console has been loaded...')\\n }\\n if (this.console === false) {\\n window.eruda.show()\\n window.eruda.show('console')\\n this.console = true\\n } else {\\n window.eruda.hide()\\n this.console = false\\n }\\n }\\n\\n IpfsAction.prototype.handlePublishToIpns = async function (event) {\\n var cid = null\\n var ipnsKey = null\\n var wikiCid = null\\n var wikiIpnsKey = null\\n const self = this\\n const wiki = $tw.ipfs.getDocumentUrl()\\n if (wiki.protocol === fileProtocol) {\\n $tw.utils.alert(name, 'Undefined IPFS identifier...')\\n return false\\n }\\n if (wiki.pathname === '/') {\\n $tw.utils.alert(name, 'Unknown IPFS identifier...')\\n return false\\n }\\n var ipnsName = $tw.utils.getIpfsIpnsName()\\n ipnsName =\\n ipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n ? null\\n : ipnsName.trim()\\n if (ipnsName == null) {\\n $tw.utils.alert(name, 'Undefined IPNS name....')\\n return false\\n }\\n try {\\n var { cid, ipnsKey } = await $tw.ipfs.resolveUrl(\\n true,\\n false,\\n `/ipns/${ipnsName}`\\n )\\n var { cid: wikiCid, ipnsKey: wikiIpnsKey } = await $tw.ipfs.resolveUrl(\\n true,\\n true,\\n wiki\\n )\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return false\\n }\\n if (wikiIpnsKey !== null && wikiIpnsKey === ipnsKey) {\\n $tw.utils.alert(name, 'Default IPNS key matches current IPNS key....')\\n return false\\n }\\n $tw.utils.alert(name, 'Publishing IPNS name: ' + ipnsName)\\n $tw.ipfs\\n .publishIpnsName(wikiCid, ipnsKey, ipnsName)\\n .then(data => {\\n $tw.ipfs.requestToUnpin(cid)\\n $tw.utils.alert(name, 'Successfully Published IPNS name: ' + ipnsName)\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n return true\\n }\\n\\n IpfsAction.prototype.exportTiddlersAsJson = async function (\\n exportFilter,\\n exportUri,\\n spaces\\n ) {\\n var tiddlers = $tw.wiki.filterTiddlers(exportFilter)\\n var spaces =\\n spaces === undefined ? $tw.config.preferences.jsonSpaces : spaces\\n var data = []\\n // Process Tiddlers\\n for (var t = 0; t \u003C tiddlers.length; t++) {\\n // Load Tiddler\\n var tiddler = $tw.wiki.getTiddler(tiddlers[t])\\n // Process\\n var fields = {}\\n // Process fields\\n for (var field in tiddler.fields) {\\n // Discard\\n if (field === 'tags' || field === '_export_uri') {\\n continue\\n }\\n var ipnsKey = null\\n var fieldValue = tiddler.getFieldString(field)\\n if (field === '_canonical_uri' && fieldValue === exportUri) {\\n continue\\n }\\n if (field === '_import_uri' && fieldValue === exportUri) {\\n continue\\n }\\n try {\\n var { ipnsKey } = await $tw.ipfs.resolveUrl(false, false, fieldValue)\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return null\\n }\\n // IPNS\\n if (ipnsKey !== null) {\\n fieldValue = `/${ipnsKeyword}/${ipnsKey}`\\n }\\n // Store field\\n fields[field] = fieldValue\\n }\\n // Process tags\\n var tags = tiddler.fields.tags\\n if (tags !== undefined && tags !== null) {\\n var tagValues = ''\\n for (var i = 0; i \u003C tags.length; i++) {\\n const tag = tags[i]\\n // Discard\\n if (tag === '$:/isExported' || tag === '$:/isImported') {\\n continue\\n }\\n tagValues =\\n (tagValues.length === 0 ? '[[' : `${tagValues} [[`) + `${tag}]]`\\n }\\n // Store tags\\n fields.tags = tagValues\\n }\\n // Store\\n data.push(fields)\\n }\\n return JSON.stringify(data, null, spaces)\\n }\\n\\n IpfsAction.prototype.exportTiddler = async function (\\n child,\\n exportUri,\\n tiddler\\n ) {\\n // Check\\n if (tiddler === undefined || tiddler == null) {\\n const error = new Error('Unknown Tiddler...')\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return null\\n }\\n // Title\\n const title = tiddler.getFieldString('title')\\n // Filter\\n var exportFilter = `[[${tiddler.fields.title}]]`\\n // Child filters\\n if (child) {\\n // Links\\n const linked = $tw.wiki.getTiddlerLinks(title)\\n this.getLogger().info(`Found ${linked.length} Tiddler link(s)...`)\\n // Transcluded\\n const transcluded = this.transcludeContent(title)\\n this.getLogger().info(\\n `Found ${transcluded.length} transcluded Tiddler reference(s)...`\\n )\\n const filtered = linked.concat(transcluded)\\n // Process filtered content\\n for (var i = 0; i \u003C filtered.length; i++) {\\n if (exportFilter.includes(`[[${filtered[i]}]]`) === false) {\\n exportFilter = `${exportFilter} [[${filtered[i]}]]`\\n }\\n }\\n }\\n var content = null\\n if (child || $tw.utils.getIpfsExport() === 'json') {\\n content = await this.exportTiddlersAsJson(exportFilter, exportUri)\\n } else if ($tw.utils.getIpfsExport() === 'static') {\\n // Export Tiddler as Static River\\n const options = {\\n downloadType: 'text/plain',\\n method: 'download',\\n template: '$:/core/templates/exporters/StaticRiver',\\n variables: {\\n exportFilter: exportFilter\\n }\\n }\\n content = $tw.wiki.renderTiddler(\\n 'text/plain',\\n '$:/core/templates/exporters/StaticRiver',\\n options\\n )\\n } else {\\n // Export Tiddler as tid\\n const options = {\\n downloadType: 'text/plain',\\n method: 'download',\\n template: '$:/core/templates/exporters/TidFile',\\n variables: {\\n exportFilter: exportFilter\\n }\\n }\\n content = $tw.wiki.renderTiddler(\\n 'text/plain',\\n '$:/core/templates/exporters/TidFile',\\n options\\n )\\n }\\n if (content !== undefined && content !== null) {\\n // Encrypt\\n if ($tw.crypto.hasPassword()) {\\n try {\\n content = $tw.crypto.encrypt(content, $tw.crypto.currentPassword)\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, 'Failed to encrypt content...')\\n return null\\n }\\n }\\n try {\\n content = $tw.ipfs.StringToUint8Array(content)\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, 'Failed to convert content...')\\n return null\\n }\\n }\\n return content\\n }\\n\\n IpfsAction.prototype.transcludeContent = function (title) {\\n var tiddlers = []\\n // Build a transclude widget\\n var transclude = $tw.wiki.makeTranscludeWidget(title)\\n // Build a fake document element\\n const container = $tw.fakeDocument.createElement('div')\\n // Transclude\\n transclude.render(container, null)\\n // Process children\\n this.locateTiddlers(transclude, tiddlers)\\n // Return\\n return tiddlers\\n }\\n\\n IpfsAction.prototype.locateTiddlers = function (transclude, tiddlers) {\\n // Children lookup\\n for (var i = 0; i \u003C transclude.children.length; i++) {\\n // Current child\\n const child = transclude.children[i]\\n if (child.variables !== undefined && child.variables !== null) {\\n // Locate Tiddler\\n const currentTiddler = 'currentTiddler'\\n const current = child.variables[currentTiddler]\\n if (\\n current !== undefined &&\\n current !== null &&\\n current.value !== undefined &&\\n current.value !== null\\n ) {\\n if (tiddlers.indexOf(current.value) === -1) {\\n tiddlers.push(current.value)\\n }\\n }\\n }\\n // Process children\\n this.locateTiddlers(child, tiddlers)\\n }\\n }\\n\\n exports.IpfsAction = IpfsAction\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"library\"\n },\n \"$:/plugins/ipfs/ipfs-bundle.js\": {\n \"title\": \"$:/plugins/ipfs/ipfs-bundle.js\",\n \"text\": \"(function(f){if(typeof exports===\\\"object\\\"&&typeof module!==\\\"undefined\\\"){module.exports=f()}else if(typeof define===\\\"function\\\"&&define.amd){define([],f)}else{var g;if(typeof window!==\\\"undefined\\\"){g=window}else if(typeof global!==\\\"undefined\\\"){g=global}else if(typeof self!==\\\"undefined\\\"){g=self}else{g=this}g.IpfsBundle = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\\\"function\\\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\\\"Cannot find module '\\\"+i+\\\"'\\\");throw a.code=\\\"MODULE_NOT_FOUND\\\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\\\"function\\\"==typeof require&&require,i=0;i\u003Ct.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\\nfunction _asyncIterator(iterable) {\\n var method;\\n\\n if (typeof Symbol !== \\\"undefined\\\") {\\n if (Symbol.asyncIterator) {\\n method = iterable[Symbol.asyncIterator];\\n if (method != null) return method.call(iterable);\\n }\\n\\n if (Symbol.iterator) {\\n method = iterable[Symbol.iterator];\\n if (method != null) return method.call(iterable);\\n }\\n }\\n\\n throw new TypeError(\\\"Object is not async iterable\\\");\\n}\\n\\nmodule.exports = _asyncIterator;\\n},{}],2:[function(require,module,exports){\\nfunction _interopRequireDefault(obj) {\\n return obj && obj.__esModule ? obj : {\\n \\\"default\\\": obj\\n };\\n}\\n\\nmodule.exports = _interopRequireDefault;\\n},{}],3:[function(require,module,exports){\\n'use strict'\\n// base-x encoding / decoding\\n// Copyright (c) 2018 base-x contributors\\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\\n// Distributed under the MIT software license, see the accompanying\\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\\n// @ts-ignore\\nvar _Buffer = require('safe-buffer').Buffer\\nfunction base (ALPHABET) {\\n if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }\\n var BASE_MAP = new Uint8Array(256)\\n for (var j = 0; j \u003C BASE_MAP.length; j++) {\\n BASE_MAP[j] = 255\\n }\\n for (var i = 0; i \u003C ALPHABET.length; i++) {\\n var x = ALPHABET.charAt(i)\\n var xc = x.charCodeAt(0)\\n if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }\\n BASE_MAP[xc] = i\\n }\\n var BASE = ALPHABET.length\\n var LEADER = ALPHABET.charAt(0)\\n var FACTOR = Math.log(BASE) / Math.log(256) // log(BASE) / log(256), rounded up\\n var iFACTOR = Math.log(256) / Math.log(BASE) // log(256) / log(BASE), rounded up\\n function encode (source) {\\n if (Array.isArray(source) || source instanceof Uint8Array) { source = _Buffer.from(source) }\\n if (!_Buffer.isBuffer(source)) { throw new TypeError('Expected Buffer') }\\n if (source.length === 0) { return '' }\\n // Skip & count leading zeroes.\\n var zeroes = 0\\n var length = 0\\n var pbegin = 0\\n var pend = source.length\\n while (pbegin !== pend && source[pbegin] === 0) {\\n pbegin++\\n zeroes++\\n }\\n // Allocate enough space in big-endian base58 representation.\\n var size = ((pend - pbegin) * iFACTOR + 1) >>> 0\\n var b58 = new Uint8Array(size)\\n // Process the bytes.\\n while (pbegin !== pend) {\\n var carry = source[pbegin]\\n // Apply \\\"b58 = b58 * 256 + ch\\\".\\n var i = 0\\n for (var it1 = size - 1; (carry !== 0 || i \u003C length) && (it1 !== -1); it1--, i++) {\\n carry += (256 * b58[it1]) >>> 0\\n b58[it1] = (carry % BASE) >>> 0\\n carry = (carry / BASE) >>> 0\\n }\\n if (carry !== 0) { throw new Error('Non-zero carry') }\\n length = i\\n pbegin++\\n }\\n // Skip leading zeroes in base58 result.\\n var it2 = size - length\\n while (it2 !== size && b58[it2] === 0) {\\n it2++\\n }\\n // Translate the result into a string.\\n var str = LEADER.repeat(zeroes)\\n for (; it2 \u003C size; ++it2) { str += ALPHABET.charAt(b58[it2]) }\\n return str\\n }\\n function decodeUnsafe (source) {\\n if (typeof source !== 'string') { throw new TypeError('Expected String') }\\n if (source.length === 0) { return _Buffer.alloc(0) }\\n var psz = 0\\n // Skip leading spaces.\\n if (source[psz] === ' ') { return }\\n // Skip and count leading '1's.\\n var zeroes = 0\\n var length = 0\\n while (source[psz] === LEADER) {\\n zeroes++\\n psz++\\n }\\n // Allocate enough space in big-endian base256 representation.\\n var size = (((source.length - psz) * FACTOR) + 1) >>> 0 // log(58) / log(256), rounded up.\\n var b256 = new Uint8Array(size)\\n // Process the characters.\\n while (source[psz]) {\\n // Decode character\\n var carry = BASE_MAP[source.charCodeAt(psz)]\\n // Invalid character\\n if (carry === 255) { return }\\n var i = 0\\n for (var it3 = size - 1; (carry !== 0 || i \u003C length) && (it3 !== -1); it3--, i++) {\\n carry += (BASE * b256[it3]) >>> 0\\n b256[it3] = (carry % 256) >>> 0\\n carry = (carry / 256) >>> 0\\n }\\n if (carry !== 0) { throw new Error('Non-zero carry') }\\n length = i\\n psz++\\n }\\n // Skip trailing spaces.\\n if (source[psz] === ' ') { return }\\n // Skip leading zeroes in b256.\\n var it4 = size - length\\n while (it4 !== size && b256[it4] === 0) {\\n it4++\\n }\\n var vch = _Buffer.allocUnsafe(zeroes + (size - it4))\\n vch.fill(0x00, 0, zeroes)\\n var j = zeroes\\n while (it4 !== size) {\\n vch[j++] = b256[it4++]\\n }\\n return vch\\n }\\n function decode (string) {\\n var buffer = decodeUnsafe(string)\\n if (buffer) { return buffer }\\n throw new Error('Non-base' + BASE + ' character')\\n }\\n return {\\n encode: encode,\\n decodeUnsafe: decodeUnsafe,\\n decode: decode\\n }\\n}\\nmodule.exports = base\\n\\n},{\\\"safe-buffer\\\":63}],4:[function(require,module,exports){\\n'use strict'\\n\\nexports.byteLength = byteLength\\nexports.toByteArray = toByteArray\\nexports.fromByteArray = fromByteArray\\n\\nvar lookup = []\\nvar revLookup = []\\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\\n\\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\\nfor (var i = 0, len = code.length; i \u003C len; ++i) {\\n lookup[i] = code[i]\\n revLookup[code.charCodeAt(i)] = i\\n}\\n\\n// Support decoding URL-safe base64 strings, as Node.js does.\\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\\nrevLookup['-'.charCodeAt(0)] = 62\\nrevLookup['_'.charCodeAt(0)] = 63\\n\\nfunction getLens (b64) {\\n var len = b64.length\\n\\n if (len % 4 > 0) {\\n throw new Error('Invalid string. Length must be a multiple of 4')\\n }\\n\\n // Trim off extra bytes after placeholder bytes are found\\n // See: https://github.com/beatgammit/base64-js/issues/42\\n var validLen = b64.indexOf('=')\\n if (validLen === -1) validLen = len\\n\\n var placeHoldersLen = validLen === len\\n ? 0\\n : 4 - (validLen % 4)\\n\\n return [validLen, placeHoldersLen]\\n}\\n\\n// base64 is 4/3 + up to two characters of the original data\\nfunction byteLength (b64) {\\n var lens = getLens(b64)\\n var validLen = lens[0]\\n var placeHoldersLen = lens[1]\\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\\n}\\n\\nfunction _byteLength (b64, validLen, placeHoldersLen) {\\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\\n}\\n\\nfunction toByteArray (b64) {\\n var tmp\\n var lens = getLens(b64)\\n var validLen = lens[0]\\n var placeHoldersLen = lens[1]\\n\\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\\n\\n var curByte = 0\\n\\n // if there are placeholders, only get up to the last complete 4 chars\\n var len = placeHoldersLen > 0\\n ? validLen - 4\\n : validLen\\n\\n var i\\n for (i = 0; i \u003C len; i += 4) {\\n tmp =\\n (revLookup[b64.charCodeAt(i)] \u003C\u003C 18) |\\n (revLookup[b64.charCodeAt(i + 1)] \u003C\u003C 12) |\\n (revLookup[b64.charCodeAt(i + 2)] \u003C\u003C 6) |\\n revLookup[b64.charCodeAt(i + 3)]\\n arr[curByte++] = (tmp >> 16) & 0xFF\\n arr[curByte++] = (tmp >> 8) & 0xFF\\n arr[curByte++] = tmp & 0xFF\\n }\\n\\n if (placeHoldersLen === 2) {\\n tmp =\\n (revLookup[b64.charCodeAt(i)] \u003C\u003C 2) |\\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\\n arr[curByte++] = tmp & 0xFF\\n }\\n\\n if (placeHoldersLen === 1) {\\n tmp =\\n (revLookup[b64.charCodeAt(i)] \u003C\u003C 10) |\\n (revLookup[b64.charCodeAt(i + 1)] \u003C\u003C 4) |\\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\\n arr[curByte++] = (tmp >> 8) & 0xFF\\n arr[curByte++] = tmp & 0xFF\\n }\\n\\n return arr\\n}\\n\\nfunction tripletToBase64 (num) {\\n return lookup[num >> 18 & 0x3F] +\\n lookup[num >> 12 & 0x3F] +\\n lookup[num >> 6 & 0x3F] +\\n lookup[num & 0x3F]\\n}\\n\\nfunction encodeChunk (uint8, start, end) {\\n var tmp\\n var output = []\\n for (var i = start; i \u003C end; i += 3) {\\n tmp =\\n ((uint8[i] \u003C\u003C 16) & 0xFF0000) +\\n ((uint8[i + 1] \u003C\u003C 8) & 0xFF00) +\\n (uint8[i + 2] & 0xFF)\\n output.push(tripletToBase64(tmp))\\n }\\n return output.join('')\\n}\\n\\nfunction fromByteArray (uint8) {\\n var tmp\\n var len = uint8.length\\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\\n var parts = []\\n var maxChunkLength = 16383 // must be multiple of 3\\n\\n // go through the array every three bytes, we'll deal with trailing stuff later\\n for (var i = 0, len2 = len - extraBytes; i \u003C len2; i += maxChunkLength) {\\n parts.push(encodeChunk(\\n uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\\n ))\\n }\\n\\n // pad the end with zeros, but make sure to not forget the extra bytes\\n if (extraBytes === 1) {\\n tmp = uint8[len - 1]\\n parts.push(\\n lookup[tmp >> 2] +\\n lookup[(tmp \u003C\u003C 4) & 0x3F] +\\n '=='\\n )\\n } else if (extraBytes === 2) {\\n tmp = (uint8[len - 2] \u003C\u003C 8) + uint8[len - 1]\\n parts.push(\\n lookup[tmp >> 10] +\\n lookup[(tmp >> 4) & 0x3F] +\\n lookup[(tmp \u003C\u003C 2) & 0x3F] +\\n '='\\n )\\n }\\n\\n return parts.join('')\\n}\\n\\n},{}],5:[function(require,module,exports){\\n(function (Buffer){\\n/*!\\n * The buffer module from node.js, for the browser.\\n *\\n * @author Feross Aboukhadijeh \u003Chttps://feross.org>\\n * @license MIT\\n */\\n/* eslint-disable no-proto */\\n\\n'use strict'\\n\\nvar base64 = require('base64-js')\\nvar ieee754 = require('ieee754')\\n\\nexports.Buffer = Buffer\\nexports.SlowBuffer = SlowBuffer\\nexports.INSPECT_MAX_BYTES = 50\\n\\nvar K_MAX_LENGTH = 0x7fffffff\\nexports.kMaxLength = K_MAX_LENGTH\\n\\n/**\\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\\n * === true Use Uint8Array implementation (fastest)\\n * === false Print warning and recommend using `buffer` v4.x which has an Object\\n * implementation (most compatible, even IE6)\\n *\\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\\n * Opera 11.6+, iOS 4.2+.\\n *\\n * We report that the browser does not support typed arrays if the are not subclassable\\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\\n * for __proto__ and has a buggy typed array implementation.\\n */\\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\\n\\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\\n typeof console.error === 'function') {\\n console.error(\\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\\n )\\n}\\n\\nfunction typedArraySupport () {\\n // Can typed array instances can be augmented?\\n try {\\n var arr = new Uint8Array(1)\\n arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }\\n return arr.foo() === 42\\n } catch (e) {\\n return false\\n }\\n}\\n\\nObject.defineProperty(Buffer.prototype, 'parent', {\\n enumerable: true,\\n get: function () {\\n if (!Buffer.isBuffer(this)) return undefined\\n return this.buffer\\n }\\n})\\n\\nObject.defineProperty(Buffer.prototype, 'offset', {\\n enumerable: true,\\n get: function () {\\n if (!Buffer.isBuffer(this)) return undefined\\n return this.byteOffset\\n }\\n})\\n\\nfunction createBuffer (length) {\\n if (length > K_MAX_LENGTH) {\\n throw new RangeError('The value \\\"' + length + '\\\" is invalid for option \\\"size\\\"')\\n }\\n // Return an augmented `Uint8Array` instance\\n var buf = new Uint8Array(length)\\n buf.__proto__ = Buffer.prototype\\n return buf\\n}\\n\\n/**\\n * The Buffer constructor returns instances of `Uint8Array` that have their\\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\\n * returns a single octet.\\n *\\n * The `Uint8Array` prototype remains unmodified.\\n */\\n\\nfunction Buffer (arg, encodingOrOffset, length) {\\n // Common case.\\n if (typeof arg === 'number') {\\n if (typeof encodingOrOffset === 'string') {\\n throw new TypeError(\\n 'The \\\"string\\\" argument must be of type string. Received type number'\\n )\\n }\\n return allocUnsafe(arg)\\n }\\n return from(arg, encodingOrOffset, length)\\n}\\n\\n// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\\nif (typeof Symbol !== 'undefined' && Symbol.species != null &&\\n Buffer[Symbol.species] === Buffer) {\\n Object.defineProperty(Buffer, Symbol.species, {\\n value: null,\\n configurable: true,\\n enumerable: false,\\n writable: false\\n })\\n}\\n\\nBuffer.poolSize = 8192 // not used by this implementation\\n\\nfunction from (value, encodingOrOffset, length) {\\n if (typeof value === 'string') {\\n return fromString(value, encodingOrOffset)\\n }\\n\\n if (ArrayBuffer.isView(value)) {\\n return fromArrayLike(value)\\n }\\n\\n if (value == null) {\\n throw TypeError(\\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\\n 'or Array-like Object. Received type ' + (typeof value)\\n )\\n }\\n\\n if (isInstance(value, ArrayBuffer) ||\\n (value && isInstance(value.buffer, ArrayBuffer))) {\\n return fromArrayBuffer(value, encodingOrOffset, length)\\n }\\n\\n if (typeof value === 'number') {\\n throw new TypeError(\\n 'The \\\"value\\\" argument must not be of type number. Received type number'\\n )\\n }\\n\\n var valueOf = value.valueOf && value.valueOf()\\n if (valueOf != null && valueOf !== value) {\\n return Buffer.from(valueOf, encodingOrOffset, length)\\n }\\n\\n var b = fromObject(value)\\n if (b) return b\\n\\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\\n typeof value[Symbol.toPrimitive] === 'function') {\\n return Buffer.from(\\n value[Symbol.toPrimitive]('string'), encodingOrOffset, length\\n )\\n }\\n\\n throw new TypeError(\\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\\n 'or Array-like Object. Received type ' + (typeof value)\\n )\\n}\\n\\n/**\\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\\n * if value is a number.\\n * Buffer.from(str[, encoding])\\n * Buffer.from(array)\\n * Buffer.from(buffer)\\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\\n **/\\nBuffer.from = function (value, encodingOrOffset, length) {\\n return from(value, encodingOrOffset, length)\\n}\\n\\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\\n// https://github.com/feross/buffer/pull/148\\nBuffer.prototype.__proto__ = Uint8Array.prototype\\nBuffer.__proto__ = Uint8Array\\n\\nfunction assertSize (size) {\\n if (typeof size !== 'number') {\\n throw new TypeError('\\\"size\\\" argument must be of type number')\\n } else if (size \u003C 0) {\\n throw new RangeError('The value \\\"' + size + '\\\" is invalid for option \\\"size\\\"')\\n }\\n}\\n\\nfunction alloc (size, fill, encoding) {\\n assertSize(size)\\n if (size \u003C= 0) {\\n return createBuffer(size)\\n }\\n if (fill !== undefined) {\\n // Only pay attention to encoding if it's a string. This\\n // prevents accidentally sending in a number that would\\n // be interpretted as a start offset.\\n return typeof encoding === 'string'\\n ? createBuffer(size).fill(fill, encoding)\\n : createBuffer(size).fill(fill)\\n }\\n return createBuffer(size)\\n}\\n\\n/**\\n * Creates a new filled Buffer instance.\\n * alloc(size[, fill[, encoding]])\\n **/\\nBuffer.alloc = function (size, fill, encoding) {\\n return alloc(size, fill, encoding)\\n}\\n\\nfunction allocUnsafe (size) {\\n assertSize(size)\\n return createBuffer(size \u003C 0 ? 0 : checked(size) | 0)\\n}\\n\\n/**\\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\\n * */\\nBuffer.allocUnsafe = function (size) {\\n return allocUnsafe(size)\\n}\\n/**\\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\\n */\\nBuffer.allocUnsafeSlow = function (size) {\\n return allocUnsafe(size)\\n}\\n\\nfunction fromString (string, encoding) {\\n if (typeof encoding !== 'string' || encoding === '') {\\n encoding = 'utf8'\\n }\\n\\n if (!Buffer.isEncoding(encoding)) {\\n throw new TypeError('Unknown encoding: ' + encoding)\\n }\\n\\n var length = byteLength(string, encoding) | 0\\n var buf = createBuffer(length)\\n\\n var actual = buf.write(string, encoding)\\n\\n if (actual !== length) {\\n // Writing a hex string, for example, that contains invalid characters will\\n // cause everything after the first invalid character to be ignored. (e.g.\\n // 'abxxcd' will be treated as 'ab')\\n buf = buf.slice(0, actual)\\n }\\n\\n return buf\\n}\\n\\nfunction fromArrayLike (array) {\\n var length = array.length \u003C 0 ? 0 : checked(array.length) | 0\\n var buf = createBuffer(length)\\n for (var i = 0; i \u003C length; i += 1) {\\n buf[i] = array[i] & 255\\n }\\n return buf\\n}\\n\\nfunction fromArrayBuffer (array, byteOffset, length) {\\n if (byteOffset \u003C 0 || array.byteLength \u003C byteOffset) {\\n throw new RangeError('\\\"offset\\\" is outside of buffer bounds')\\n }\\n\\n if (array.byteLength \u003C byteOffset + (length || 0)) {\\n throw new RangeError('\\\"length\\\" is outside of buffer bounds')\\n }\\n\\n var buf\\n if (byteOffset === undefined && length === undefined) {\\n buf = new Uint8Array(array)\\n } else if (length === undefined) {\\n buf = new Uint8Array(array, byteOffset)\\n } else {\\n buf = new Uint8Array(array, byteOffset, length)\\n }\\n\\n // Return an augmented `Uint8Array` instance\\n buf.__proto__ = Buffer.prototype\\n return buf\\n}\\n\\nfunction fromObject (obj) {\\n if (Buffer.isBuffer(obj)) {\\n var len = checked(obj.length) | 0\\n var buf = createBuffer(len)\\n\\n if (buf.length === 0) {\\n return buf\\n }\\n\\n obj.copy(buf, 0, 0, len)\\n return buf\\n }\\n\\n if (obj.length !== undefined) {\\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\\n return createBuffer(0)\\n }\\n return fromArrayLike(obj)\\n }\\n\\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\\n return fromArrayLike(obj.data)\\n }\\n}\\n\\nfunction checked (length) {\\n // Note: cannot use `length \u003C K_MAX_LENGTH` here because that fails when\\n // length is NaN (which is otherwise coerced to zero.)\\n if (length >= K_MAX_LENGTH) {\\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\\n }\\n return length | 0\\n}\\n\\nfunction SlowBuffer (length) {\\n if (+length != length) { // eslint-disable-line eqeqeq\\n length = 0\\n }\\n return Buffer.alloc(+length)\\n}\\n\\nBuffer.isBuffer = function isBuffer (b) {\\n return b != null && b._isBuffer === true &&\\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\\n}\\n\\nBuffer.compare = function compare (a, b) {\\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\\n throw new TypeError(\\n 'The \\\"buf1\\\", \\\"buf2\\\" arguments must be one of type Buffer or Uint8Array'\\n )\\n }\\n\\n if (a === b) return 0\\n\\n var x = a.length\\n var y = b.length\\n\\n for (var i = 0, len = Math.min(x, y); i \u003C len; ++i) {\\n if (a[i] !== b[i]) {\\n x = a[i]\\n y = b[i]\\n break\\n }\\n }\\n\\n if (x \u003C y) return -1\\n if (y \u003C x) return 1\\n return 0\\n}\\n\\nBuffer.isEncoding = function isEncoding (encoding) {\\n switch (String(encoding).toLowerCase()) {\\n case 'hex':\\n case 'utf8':\\n case 'utf-8':\\n case 'ascii':\\n case 'latin1':\\n case 'binary':\\n case 'base64':\\n case 'ucs2':\\n case 'ucs-2':\\n case 'utf16le':\\n case 'utf-16le':\\n return true\\n default:\\n return false\\n }\\n}\\n\\nBuffer.concat = function concat (list, length) {\\n if (!Array.isArray(list)) {\\n throw new TypeError('\\\"list\\\" argument must be an Array of Buffers')\\n }\\n\\n if (list.length === 0) {\\n return Buffer.alloc(0)\\n }\\n\\n var i\\n if (length === undefined) {\\n length = 0\\n for (i = 0; i \u003C list.length; ++i) {\\n length += list[i].length\\n }\\n }\\n\\n var buffer = Buffer.allocUnsafe(length)\\n var pos = 0\\n for (i = 0; i \u003C list.length; ++i) {\\n var buf = list[i]\\n if (isInstance(buf, Uint8Array)) {\\n buf = Buffer.from(buf)\\n }\\n if (!Buffer.isBuffer(buf)) {\\n throw new TypeError('\\\"list\\\" argument must be an Array of Buffers')\\n }\\n buf.copy(buffer, pos)\\n pos += buf.length\\n }\\n return buffer\\n}\\n\\nfunction byteLength (string, encoding) {\\n if (Buffer.isBuffer(string)) {\\n return string.length\\n }\\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\\n return string.byteLength\\n }\\n if (typeof string !== 'string') {\\n throw new TypeError(\\n 'The \\\"string\\\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\\n 'Received type ' + typeof string\\n )\\n }\\n\\n var len = string.length\\n var mustMatch = (arguments.length > 2 && arguments[2] === true)\\n if (!mustMatch && len === 0) return 0\\n\\n // Use a for loop to avoid recursion\\n var loweredCase = false\\n for (;;) {\\n switch (encoding) {\\n case 'ascii':\\n case 'latin1':\\n case 'binary':\\n return len\\n case 'utf8':\\n case 'utf-8':\\n return utf8ToBytes(string).length\\n case 'ucs2':\\n case 'ucs-2':\\n case 'utf16le':\\n case 'utf-16le':\\n return len * 2\\n case 'hex':\\n return len >>> 1\\n case 'base64':\\n return base64ToBytes(string).length\\n default:\\n if (loweredCase) {\\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\\n }\\n encoding = ('' + encoding).toLowerCase()\\n loweredCase = true\\n }\\n }\\n}\\nBuffer.byteLength = byteLength\\n\\nfunction slowToString (encoding, start, end) {\\n var loweredCase = false\\n\\n // No need to verify that \\\"this.length \u003C= MAX_UINT32\\\" since it's a read-only\\n // property of a typed array.\\n\\n // This behaves neither like String nor Uint8Array in that we set start/end\\n // to their upper/lower bounds if the value passed is out of range.\\n // undefined is handled specially as per ECMA-262 6th Edition,\\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\\n if (start === undefined || start \u003C 0) {\\n start = 0\\n }\\n // Return early if start > this.length. Done here to prevent potential uint32\\n // coercion fail below.\\n if (start > this.length) {\\n return ''\\n }\\n\\n if (end === undefined || end > this.length) {\\n end = this.length\\n }\\n\\n if (end \u003C= 0) {\\n return ''\\n }\\n\\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\\n end >>>= 0\\n start >>>= 0\\n\\n if (end \u003C= start) {\\n return ''\\n }\\n\\n if (!encoding) encoding = 'utf8'\\n\\n while (true) {\\n switch (encoding) {\\n case 'hex':\\n return hexSlice(this, start, end)\\n\\n case 'utf8':\\n case 'utf-8':\\n return utf8Slice(this, start, end)\\n\\n case 'ascii':\\n return asciiSlice(this, start, end)\\n\\n case 'latin1':\\n case 'binary':\\n return latin1Slice(this, start, end)\\n\\n case 'base64':\\n return base64Slice(this, start, end)\\n\\n case 'ucs2':\\n case 'ucs-2':\\n case 'utf16le':\\n case 'utf-16le':\\n return utf16leSlice(this, start, end)\\n\\n default:\\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\\n encoding = (encoding + '').toLowerCase()\\n loweredCase = true\\n }\\n }\\n}\\n\\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\\n// reliably in a browserify context because there could be multiple different\\n// copies of the 'buffer' package in use. This method works even for Buffer\\n// instances that were created from another copy of the `buffer` package.\\n// See: https://github.com/feross/buffer/issues/154\\nBuffer.prototype._isBuffer = true\\n\\nfunction swap (b, n, m) {\\n var i = b[n]\\n b[n] = b[m]\\n b[m] = i\\n}\\n\\nBuffer.prototype.swap16 = function swap16 () {\\n var len = this.length\\n if (len % 2 !== 0) {\\n throw new RangeError('Buffer size must be a multiple of 16-bits')\\n }\\n for (var i = 0; i \u003C len; i += 2) {\\n swap(this, i, i + 1)\\n }\\n return this\\n}\\n\\nBuffer.prototype.swap32 = function swap32 () {\\n var len = this.length\\n if (len % 4 !== 0) {\\n throw new RangeError('Buffer size must be a multiple of 32-bits')\\n }\\n for (var i = 0; i \u003C len; i += 4) {\\n swap(this, i, i + 3)\\n swap(this, i + 1, i + 2)\\n }\\n return this\\n}\\n\\nBuffer.prototype.swap64 = function swap64 () {\\n var len = this.length\\n if (len % 8 !== 0) {\\n throw new RangeError('Buffer size must be a multiple of 64-bits')\\n }\\n for (var i = 0; i \u003C len; i += 8) {\\n swap(this, i, i + 7)\\n swap(this, i + 1, i + 6)\\n swap(this, i + 2, i + 5)\\n swap(this, i + 3, i + 4)\\n }\\n return this\\n}\\n\\nBuffer.prototype.toString = function toString () {\\n var length = this.length\\n if (length === 0) return ''\\n if (arguments.length === 0) return utf8Slice(this, 0, length)\\n return slowToString.apply(this, arguments)\\n}\\n\\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\\n\\nBuffer.prototype.equals = function equals (b) {\\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\\n if (this === b) return true\\n return Buffer.compare(this, b) === 0\\n}\\n\\nBuffer.prototype.inspect = function inspect () {\\n var str = ''\\n var max = exports.INSPECT_MAX_BYTES\\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\\n if (this.length > max) str += ' ... '\\n return '\u003CBuffer ' + str + '>'\\n}\\n\\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\\n if (isInstance(target, Uint8Array)) {\\n target = Buffer.from(target, target.offset, target.byteLength)\\n }\\n if (!Buffer.isBuffer(target)) {\\n throw new TypeError(\\n 'The \\\"target\\\" argument must be one of type Buffer or Uint8Array. ' +\\n 'Received type ' + (typeof target)\\n )\\n }\\n\\n if (start === undefined) {\\n start = 0\\n }\\n if (end === undefined) {\\n end = target ? target.length : 0\\n }\\n if (thisStart === undefined) {\\n thisStart = 0\\n }\\n if (thisEnd === undefined) {\\n thisEnd = this.length\\n }\\n\\n if (start \u003C 0 || end > target.length || thisStart \u003C 0 || thisEnd > this.length) {\\n throw new RangeError('out of range index')\\n }\\n\\n if (thisStart >= thisEnd && start >= end) {\\n return 0\\n }\\n if (thisStart >= thisEnd) {\\n return -1\\n }\\n if (start >= end) {\\n return 1\\n }\\n\\n start >>>= 0\\n end >>>= 0\\n thisStart >>>= 0\\n thisEnd >>>= 0\\n\\n if (this === target) return 0\\n\\n var x = thisEnd - thisStart\\n var y = end - start\\n var len = Math.min(x, y)\\n\\n var thisCopy = this.slice(thisStart, thisEnd)\\n var targetCopy = target.slice(start, end)\\n\\n for (var i = 0; i \u003C len; ++i) {\\n if (thisCopy[i] !== targetCopy[i]) {\\n x = thisCopy[i]\\n y = targetCopy[i]\\n break\\n }\\n }\\n\\n if (x \u003C y) return -1\\n if (y \u003C x) return 1\\n return 0\\n}\\n\\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\\n// OR the last index of `val` in `buffer` at offset \u003C= `byteOffset`.\\n//\\n// Arguments:\\n// - buffer - a Buffer to search\\n// - val - a string, Buffer, or number\\n// - byteOffset - an index into `buffer`; will be clamped to an int32\\n// - encoding - an optional encoding, relevant is val is a string\\n// - dir - true for indexOf, false for lastIndexOf\\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\\n // Empty buffer means no match\\n if (buffer.length === 0) return -1\\n\\n // Normalize byteOffset\\n if (typeof byteOffset === 'string') {\\n encoding = byteOffset\\n byteOffset = 0\\n } else if (byteOffset > 0x7fffffff) {\\n byteOffset = 0x7fffffff\\n } else if (byteOffset \u003C -0x80000000) {\\n byteOffset = -0x80000000\\n }\\n byteOffset = +byteOffset // Coerce to Number.\\n if (numberIsNaN(byteOffset)) {\\n // byteOffset: it it's undefined, null, NaN, \\\"foo\\\", etc, search whole buffer\\n byteOffset = dir ? 0 : (buffer.length - 1)\\n }\\n\\n // Normalize byteOffset: negative offsets start from the end of the buffer\\n if (byteOffset \u003C 0) byteOffset = buffer.length + byteOffset\\n if (byteOffset >= buffer.length) {\\n if (dir) return -1\\n else byteOffset = buffer.length - 1\\n } else if (byteOffset \u003C 0) {\\n if (dir) byteOffset = 0\\n else return -1\\n }\\n\\n // Normalize val\\n if (typeof val === 'string') {\\n val = Buffer.from(val, encoding)\\n }\\n\\n // Finally, search either indexOf (if dir is true) or lastIndexOf\\n if (Buffer.isBuffer(val)) {\\n // Special case: looking for empty string/buffer always fails\\n if (val.length === 0) {\\n return -1\\n }\\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\\n } else if (typeof val === 'number') {\\n val = val & 0xFF // Search for a byte value [0-255]\\n if (typeof Uint8Array.prototype.indexOf === 'function') {\\n if (dir) {\\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\\n } else {\\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\\n }\\n }\\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\\n }\\n\\n throw new TypeError('val must be string, number or Buffer')\\n}\\n\\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\\n var indexSize = 1\\n var arrLength = arr.length\\n var valLength = val.length\\n\\n if (encoding !== undefined) {\\n encoding = String(encoding).toLowerCase()\\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\\n encoding === 'utf16le' || encoding === 'utf-16le') {\\n if (arr.length \u003C 2 || val.length \u003C 2) {\\n return -1\\n }\\n indexSize = 2\\n arrLength /= 2\\n valLength /= 2\\n byteOffset /= 2\\n }\\n }\\n\\n function read (buf, i) {\\n if (indexSize === 1) {\\n return buf[i]\\n } else {\\n return buf.readUInt16BE(i * indexSize)\\n }\\n }\\n\\n var i\\n if (dir) {\\n var foundIndex = -1\\n for (i = byteOffset; i \u003C arrLength; i++) {\\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\\n if (foundIndex === -1) foundIndex = i\\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\\n } else {\\n if (foundIndex !== -1) i -= i - foundIndex\\n foundIndex = -1\\n }\\n }\\n } else {\\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\\n for (i = byteOffset; i >= 0; i--) {\\n var found = true\\n for (var j = 0; j \u003C valLength; j++) {\\n if (read(arr, i + j) !== read(val, j)) {\\n found = false\\n break\\n }\\n }\\n if (found) return i\\n }\\n }\\n\\n return -1\\n}\\n\\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\\n return this.indexOf(val, byteOffset, encoding) !== -1\\n}\\n\\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\\n}\\n\\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\\n}\\n\\nfunction hexWrite (buf, string, offset, length) {\\n offset = Number(offset) || 0\\n var remaining = buf.length - offset\\n if (!length) {\\n length = remaining\\n } else {\\n length = Number(length)\\n if (length > remaining) {\\n length = remaining\\n }\\n }\\n\\n var strLen = string.length\\n\\n if (length > strLen / 2) {\\n length = strLen / 2\\n }\\n for (var i = 0; i \u003C length; ++i) {\\n var parsed = parseInt(string.substr(i * 2, 2), 16)\\n if (numberIsNaN(parsed)) return i\\n buf[offset + i] = parsed\\n }\\n return i\\n}\\n\\nfunction utf8Write (buf, string, offset, length) {\\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\\n}\\n\\nfunction asciiWrite (buf, string, offset, length) {\\n return blitBuffer(asciiToBytes(string), buf, offset, length)\\n}\\n\\nfunction latin1Write (buf, string, offset, length) {\\n return asciiWrite(buf, string, offset, length)\\n}\\n\\nfunction base64Write (buf, string, offset, length) {\\n return blitBuffer(base64ToBytes(string), buf, offset, length)\\n}\\n\\nfunction ucs2Write (buf, string, offset, length) {\\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\\n}\\n\\nBuffer.prototype.write = function write (string, offset, length, encoding) {\\n // Buffer#write(string)\\n if (offset === undefined) {\\n encoding = 'utf8'\\n length = this.length\\n offset = 0\\n // Buffer#write(string, encoding)\\n } else if (length === undefined && typeof offset === 'string') {\\n encoding = offset\\n length = this.length\\n offset = 0\\n // Buffer#write(string, offset[, length][, encoding])\\n } else if (isFinite(offset)) {\\n offset = offset >>> 0\\n if (isFinite(length)) {\\n length = length >>> 0\\n if (encoding === undefined) encoding = 'utf8'\\n } else {\\n encoding = length\\n length = undefined\\n }\\n } else {\\n throw new Error(\\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\\n )\\n }\\n\\n var remaining = this.length - offset\\n if (length === undefined || length > remaining) length = remaining\\n\\n if ((string.length > 0 && (length \u003C 0 || offset \u003C 0)) || offset > this.length) {\\n throw new RangeError('Attempt to write outside buffer bounds')\\n }\\n\\n if (!encoding) encoding = 'utf8'\\n\\n var loweredCase = false\\n for (;;) {\\n switch (encoding) {\\n case 'hex':\\n return hexWrite(this, string, offset, length)\\n\\n case 'utf8':\\n case 'utf-8':\\n return utf8Write(this, string, offset, length)\\n\\n case 'ascii':\\n return asciiWrite(this, string, offset, length)\\n\\n case 'latin1':\\n case 'binary':\\n return latin1Write(this, string, offset, length)\\n\\n case 'base64':\\n // Warning: maxLength not taken into account in base64Write\\n return base64Write(this, string, offset, length)\\n\\n case 'ucs2':\\n case 'ucs-2':\\n case 'utf16le':\\n case 'utf-16le':\\n return ucs2Write(this, string, offset, length)\\n\\n default:\\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\\n encoding = ('' + encoding).toLowerCase()\\n loweredCase = true\\n }\\n }\\n}\\n\\nBuffer.prototype.toJSON = function toJSON () {\\n return {\\n type: 'Buffer',\\n data: Array.prototype.slice.call(this._arr || this, 0)\\n }\\n}\\n\\nfunction base64Slice (buf, start, end) {\\n if (start === 0 && end === buf.length) {\\n return base64.fromByteArray(buf)\\n } else {\\n return base64.fromByteArray(buf.slice(start, end))\\n }\\n}\\n\\nfunction utf8Slice (buf, start, end) {\\n end = Math.min(buf.length, end)\\n var res = []\\n\\n var i = start\\n while (i \u003C end) {\\n var firstByte = buf[i]\\n var codePoint = null\\n var bytesPerSequence = (firstByte > 0xEF) ? 4\\n : (firstByte > 0xDF) ? 3\\n : (firstByte > 0xBF) ? 2\\n : 1\\n\\n if (i + bytesPerSequence \u003C= end) {\\n var secondByte, thirdByte, fourthByte, tempCodePoint\\n\\n switch (bytesPerSequence) {\\n case 1:\\n if (firstByte \u003C 0x80) {\\n codePoint = firstByte\\n }\\n break\\n case 2:\\n secondByte = buf[i + 1]\\n if ((secondByte & 0xC0) === 0x80) {\\n tempCodePoint = (firstByte & 0x1F) \u003C\u003C 0x6 | (secondByte & 0x3F)\\n if (tempCodePoint > 0x7F) {\\n codePoint = tempCodePoint\\n }\\n }\\n break\\n case 3:\\n secondByte = buf[i + 1]\\n thirdByte = buf[i + 2]\\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\\n tempCodePoint = (firstByte & 0xF) \u003C\u003C 0xC | (secondByte & 0x3F) \u003C\u003C 0x6 | (thirdByte & 0x3F)\\n if (tempCodePoint > 0x7FF && (tempCodePoint \u003C 0xD800 || tempCodePoint > 0xDFFF)) {\\n codePoint = tempCodePoint\\n }\\n }\\n break\\n case 4:\\n secondByte = buf[i + 1]\\n thirdByte = buf[i + 2]\\n fourthByte = buf[i + 3]\\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\\n tempCodePoint = (firstByte & 0xF) \u003C\u003C 0x12 | (secondByte & 0x3F) \u003C\u003C 0xC | (thirdByte & 0x3F) \u003C\u003C 0x6 | (fourthByte & 0x3F)\\n if (tempCodePoint > 0xFFFF && tempCodePoint \u003C 0x110000) {\\n codePoint = tempCodePoint\\n }\\n }\\n }\\n }\\n\\n if (codePoint === null) {\\n // we did not generate a valid codePoint so insert a\\n // replacement char (U+FFFD) and advance only 1 byte\\n codePoint = 0xFFFD\\n bytesPerSequence = 1\\n } else if (codePoint > 0xFFFF) {\\n // encode to utf16 (surrogate pair dance)\\n codePoint -= 0x10000\\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\\n codePoint = 0xDC00 | codePoint & 0x3FF\\n }\\n\\n res.push(codePoint)\\n i += bytesPerSequence\\n }\\n\\n return decodeCodePointsArray(res)\\n}\\n\\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\\n// the lowest limit is Chrome, with 0x10000 args.\\n// We go 1 magnitude less, for safety\\nvar MAX_ARGUMENTS_LENGTH = 0x1000\\n\\nfunction decodeCodePointsArray (codePoints) {\\n var len = codePoints.length\\n if (len \u003C= MAX_ARGUMENTS_LENGTH) {\\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\\n }\\n\\n // Decode in chunks to avoid \\\"call stack size exceeded\\\".\\n var res = ''\\n var i = 0\\n while (i \u003C len) {\\n res += String.fromCharCode.apply(\\n String,\\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\\n )\\n }\\n return res\\n}\\n\\nfunction asciiSlice (buf, start, end) {\\n var ret = ''\\n end = Math.min(buf.length, end)\\n\\n for (var i = start; i \u003C end; ++i) {\\n ret += String.fromCharCode(buf[i] & 0x7F)\\n }\\n return ret\\n}\\n\\nfunction latin1Slice (buf, start, end) {\\n var ret = ''\\n end = Math.min(buf.length, end)\\n\\n for (var i = start; i \u003C end; ++i) {\\n ret += String.fromCharCode(buf[i])\\n }\\n return ret\\n}\\n\\nfunction hexSlice (buf, start, end) {\\n var len = buf.length\\n\\n if (!start || start \u003C 0) start = 0\\n if (!end || end \u003C 0 || end > len) end = len\\n\\n var out = ''\\n for (var i = start; i \u003C end; ++i) {\\n out += toHex(buf[i])\\n }\\n return out\\n}\\n\\nfunction utf16leSlice (buf, start, end) {\\n var bytes = buf.slice(start, end)\\n var res = ''\\n for (var i = 0; i \u003C bytes.length; i += 2) {\\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\\n }\\n return res\\n}\\n\\nBuffer.prototype.slice = function slice (start, end) {\\n var len = this.length\\n start = ~~start\\n end = end === undefined ? len : ~~end\\n\\n if (start \u003C 0) {\\n start += len\\n if (start \u003C 0) start = 0\\n } else if (start > len) {\\n start = len\\n }\\n\\n if (end \u003C 0) {\\n end += len\\n if (end \u003C 0) end = 0\\n } else if (end > len) {\\n end = len\\n }\\n\\n if (end \u003C start) end = start\\n\\n var newBuf = this.subarray(start, end)\\n // Return an augmented `Uint8Array` instance\\n newBuf.__proto__ = Buffer.prototype\\n return newBuf\\n}\\n\\n/*\\n * Need to make sure that buffer isn't trying to write out of bounds.\\n */\\nfunction checkOffset (offset, ext, length) {\\n if ((offset % 1) !== 0 || offset \u003C 0) throw new RangeError('offset is not uint')\\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\\n}\\n\\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\\n offset = offset >>> 0\\n byteLength = byteLength >>> 0\\n if (!noAssert) checkOffset(offset, byteLength, this.length)\\n\\n var val = this[offset]\\n var mul = 1\\n var i = 0\\n while (++i \u003C byteLength && (mul *= 0x100)) {\\n val += this[offset + i] * mul\\n }\\n\\n return val\\n}\\n\\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\\n offset = offset >>> 0\\n byteLength = byteLength >>> 0\\n if (!noAssert) {\\n checkOffset(offset, byteLength, this.length)\\n }\\n\\n var val = this[offset + --byteLength]\\n var mul = 1\\n while (byteLength > 0 && (mul *= 0x100)) {\\n val += this[offset + --byteLength] * mul\\n }\\n\\n return val\\n}\\n\\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 1, this.length)\\n return this[offset]\\n}\\n\\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 2, this.length)\\n return this[offset] | (this[offset + 1] \u003C\u003C 8)\\n}\\n\\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 2, this.length)\\n return (this[offset] \u003C\u003C 8) | this[offset + 1]\\n}\\n\\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 4, this.length)\\n\\n return ((this[offset]) |\\n (this[offset + 1] \u003C\u003C 8) |\\n (this[offset + 2] \u003C\u003C 16)) +\\n (this[offset + 3] * 0x1000000)\\n}\\n\\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 4, this.length)\\n\\n return (this[offset] * 0x1000000) +\\n ((this[offset + 1] \u003C\u003C 16) |\\n (this[offset + 2] \u003C\u003C 8) |\\n this[offset + 3])\\n}\\n\\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\\n offset = offset >>> 0\\n byteLength = byteLength >>> 0\\n if (!noAssert) checkOffset(offset, byteLength, this.length)\\n\\n var val = this[offset]\\n var mul = 1\\n var i = 0\\n while (++i \u003C byteLength && (mul *= 0x100)) {\\n val += this[offset + i] * mul\\n }\\n mul *= 0x80\\n\\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\\n\\n return val\\n}\\n\\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\\n offset = offset >>> 0\\n byteLength = byteLength >>> 0\\n if (!noAssert) checkOffset(offset, byteLength, this.length)\\n\\n var i = byteLength\\n var mul = 1\\n var val = this[offset + --i]\\n while (i > 0 && (mul *= 0x100)) {\\n val += this[offset + --i] * mul\\n }\\n mul *= 0x80\\n\\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\\n\\n return val\\n}\\n\\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 1, this.length)\\n if (!(this[offset] & 0x80)) return (this[offset])\\n return ((0xff - this[offset] + 1) * -1)\\n}\\n\\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 2, this.length)\\n var val = this[offset] | (this[offset + 1] \u003C\u003C 8)\\n return (val & 0x8000) ? val | 0xFFFF0000 : val\\n}\\n\\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 2, this.length)\\n var val = this[offset + 1] | (this[offset] \u003C\u003C 8)\\n return (val & 0x8000) ? val | 0xFFFF0000 : val\\n}\\n\\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 4, this.length)\\n\\n return (this[offset]) |\\n (this[offset + 1] \u003C\u003C 8) |\\n (this[offset + 2] \u003C\u003C 16) |\\n (this[offset + 3] \u003C\u003C 24)\\n}\\n\\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 4, this.length)\\n\\n return (this[offset] \u003C\u003C 24) |\\n (this[offset + 1] \u003C\u003C 16) |\\n (this[offset + 2] \u003C\u003C 8) |\\n (this[offset + 3])\\n}\\n\\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 4, this.length)\\n return ieee754.read(this, offset, true, 23, 4)\\n}\\n\\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 4, this.length)\\n return ieee754.read(this, offset, false, 23, 4)\\n}\\n\\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 8, this.length)\\n return ieee754.read(this, offset, true, 52, 8)\\n}\\n\\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\\n offset = offset >>> 0\\n if (!noAssert) checkOffset(offset, 8, this.length)\\n return ieee754.read(this, offset, false, 52, 8)\\n}\\n\\nfunction checkInt (buf, value, offset, ext, max, min) {\\n if (!Buffer.isBuffer(buf)) throw new TypeError('\\\"buffer\\\" argument must be a Buffer instance')\\n if (value > max || value \u003C min) throw new RangeError('\\\"value\\\" argument is out of bounds')\\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\\n}\\n\\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n byteLength = byteLength >>> 0\\n if (!noAssert) {\\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\\n checkInt(this, value, offset, byteLength, maxBytes, 0)\\n }\\n\\n var mul = 1\\n var i = 0\\n this[offset] = value & 0xFF\\n while (++i \u003C byteLength && (mul *= 0x100)) {\\n this[offset + i] = (value / mul) & 0xFF\\n }\\n\\n return offset + byteLength\\n}\\n\\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n byteLength = byteLength >>> 0\\n if (!noAssert) {\\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\\n checkInt(this, value, offset, byteLength, maxBytes, 0)\\n }\\n\\n var i = byteLength - 1\\n var mul = 1\\n this[offset + i] = value & 0xFF\\n while (--i >= 0 && (mul *= 0x100)) {\\n this[offset + i] = (value / mul) & 0xFF\\n }\\n\\n return offset + byteLength\\n}\\n\\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\\n this[offset] = (value & 0xff)\\n return offset + 1\\n}\\n\\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\\n this[offset] = (value & 0xff)\\n this[offset + 1] = (value >>> 8)\\n return offset + 2\\n}\\n\\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\\n this[offset] = (value >>> 8)\\n this[offset + 1] = (value & 0xff)\\n return offset + 2\\n}\\n\\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\\n this[offset + 3] = (value >>> 24)\\n this[offset + 2] = (value >>> 16)\\n this[offset + 1] = (value >>> 8)\\n this[offset] = (value & 0xff)\\n return offset + 4\\n}\\n\\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\\n this[offset] = (value >>> 24)\\n this[offset + 1] = (value >>> 16)\\n this[offset + 2] = (value >>> 8)\\n this[offset + 3] = (value & 0xff)\\n return offset + 4\\n}\\n\\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) {\\n var limit = Math.pow(2, (8 * byteLength) - 1)\\n\\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\\n }\\n\\n var i = 0\\n var mul = 1\\n var sub = 0\\n this[offset] = value & 0xFF\\n while (++i \u003C byteLength && (mul *= 0x100)) {\\n if (value \u003C 0 && sub === 0 && this[offset + i - 1] !== 0) {\\n sub = 1\\n }\\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\\n }\\n\\n return offset + byteLength\\n}\\n\\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) {\\n var limit = Math.pow(2, (8 * byteLength) - 1)\\n\\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\\n }\\n\\n var i = byteLength - 1\\n var mul = 1\\n var sub = 0\\n this[offset + i] = value & 0xFF\\n while (--i >= 0 && (mul *= 0x100)) {\\n if (value \u003C 0 && sub === 0 && this[offset + i + 1] !== 0) {\\n sub = 1\\n }\\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\\n }\\n\\n return offset + byteLength\\n}\\n\\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\\n if (value \u003C 0) value = 0xff + value + 1\\n this[offset] = (value & 0xff)\\n return offset + 1\\n}\\n\\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\\n this[offset] = (value & 0xff)\\n this[offset + 1] = (value >>> 8)\\n return offset + 2\\n}\\n\\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\\n this[offset] = (value >>> 8)\\n this[offset + 1] = (value & 0xff)\\n return offset + 2\\n}\\n\\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\\n this[offset] = (value & 0xff)\\n this[offset + 1] = (value >>> 8)\\n this[offset + 2] = (value >>> 16)\\n this[offset + 3] = (value >>> 24)\\n return offset + 4\\n}\\n\\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\\n if (value \u003C 0) value = 0xffffffff + value + 1\\n this[offset] = (value >>> 24)\\n this[offset + 1] = (value >>> 16)\\n this[offset + 2] = (value >>> 8)\\n this[offset + 3] = (value & 0xff)\\n return offset + 4\\n}\\n\\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\\n if (offset \u003C 0) throw new RangeError('Index out of range')\\n}\\n\\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) {\\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\\n }\\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\\n return offset + 4\\n}\\n\\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\\n return writeFloat(this, value, offset, true, noAssert)\\n}\\n\\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\\n return writeFloat(this, value, offset, false, noAssert)\\n}\\n\\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\\n value = +value\\n offset = offset >>> 0\\n if (!noAssert) {\\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\\n }\\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\\n return offset + 8\\n}\\n\\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\\n return writeDouble(this, value, offset, true, noAssert)\\n}\\n\\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\\n return writeDouble(this, value, offset, false, noAssert)\\n}\\n\\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\\n if (!start) start = 0\\n if (!end && end !== 0) end = this.length\\n if (targetStart >= target.length) targetStart = target.length\\n if (!targetStart) targetStart = 0\\n if (end > 0 && end \u003C start) end = start\\n\\n // Copy 0 bytes; we're done\\n if (end === start) return 0\\n if (target.length === 0 || this.length === 0) return 0\\n\\n // Fatal error conditions\\n if (targetStart \u003C 0) {\\n throw new RangeError('targetStart out of bounds')\\n }\\n if (start \u003C 0 || start >= this.length) throw new RangeError('Index out of range')\\n if (end \u003C 0) throw new RangeError('sourceEnd out of bounds')\\n\\n // Are we oob?\\n if (end > this.length) end = this.length\\n if (target.length - targetStart \u003C end - start) {\\n end = target.length - targetStart + start\\n }\\n\\n var len = end - start\\n\\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\\n // Use built-in when available, missing from IE11\\n this.copyWithin(targetStart, start, end)\\n } else if (this === target && start \u003C targetStart && targetStart \u003C end) {\\n // descending copy from end\\n for (var i = len - 1; i >= 0; --i) {\\n target[i + targetStart] = this[i + start]\\n }\\n } else {\\n Uint8Array.prototype.set.call(\\n target,\\n this.subarray(start, end),\\n targetStart\\n )\\n }\\n\\n return len\\n}\\n\\n// Usage:\\n// buffer.fill(number[, offset[, end]])\\n// buffer.fill(buffer[, offset[, end]])\\n// buffer.fill(string[, offset[, end]][, encoding])\\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\\n // Handle string cases:\\n if (typeof val === 'string') {\\n if (typeof start === 'string') {\\n encoding = start\\n start = 0\\n end = this.length\\n } else if (typeof end === 'string') {\\n encoding = end\\n end = this.length\\n }\\n if (encoding !== undefined && typeof encoding !== 'string') {\\n throw new TypeError('encoding must be a string')\\n }\\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\\n throw new TypeError('Unknown encoding: ' + encoding)\\n }\\n if (val.length === 1) {\\n var code = val.charCodeAt(0)\\n if ((encoding === 'utf8' && code \u003C 128) ||\\n encoding === 'latin1') {\\n // Fast path: If `val` fits into a single byte, use that numeric value.\\n val = code\\n }\\n }\\n } else if (typeof val === 'number') {\\n val = val & 255\\n }\\n\\n // Invalid ranges are not set to a default, so can range check early.\\n if (start \u003C 0 || this.length \u003C start || this.length \u003C end) {\\n throw new RangeError('Out of range index')\\n }\\n\\n if (end \u003C= start) {\\n return this\\n }\\n\\n start = start >>> 0\\n end = end === undefined ? this.length : end >>> 0\\n\\n if (!val) val = 0\\n\\n var i\\n if (typeof val === 'number') {\\n for (i = start; i \u003C end; ++i) {\\n this[i] = val\\n }\\n } else {\\n var bytes = Buffer.isBuffer(val)\\n ? val\\n : Buffer.from(val, encoding)\\n var len = bytes.length\\n if (len === 0) {\\n throw new TypeError('The value \\\"' + val +\\n '\\\" is invalid for argument \\\"value\\\"')\\n }\\n for (i = 0; i \u003C end - start; ++i) {\\n this[i + start] = bytes[i % len]\\n }\\n }\\n\\n return this\\n}\\n\\n// HELPER FUNCTIONS\\n// ================\\n\\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\\n\\nfunction base64clean (str) {\\n // Node takes equal signs as end of the Base64 encoding\\n str = str.split('=')[0]\\n // Node strips out invalid characters like \\\\n and \\\\t from the string, base64-js does not\\n str = str.trim().replace(INVALID_BASE64_RE, '')\\n // Node converts strings with length \u003C 2 to ''\\n if (str.length \u003C 2) return ''\\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\\n while (str.length % 4 !== 0) {\\n str = str + '='\\n }\\n return str\\n}\\n\\nfunction toHex (n) {\\n if (n \u003C 16) return '0' + n.toString(16)\\n return n.toString(16)\\n}\\n\\nfunction utf8ToBytes (string, units) {\\n units = units || Infinity\\n var codePoint\\n var length = string.length\\n var leadSurrogate = null\\n var bytes = []\\n\\n for (var i = 0; i \u003C length; ++i) {\\n codePoint = string.charCodeAt(i)\\n\\n // is surrogate component\\n if (codePoint > 0xD7FF && codePoint \u003C 0xE000) {\\n // last char was a lead\\n if (!leadSurrogate) {\\n // no lead yet\\n if (codePoint > 0xDBFF) {\\n // unexpected trail\\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\\n continue\\n } else if (i + 1 === length) {\\n // unpaired lead\\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\\n continue\\n }\\n\\n // valid lead\\n leadSurrogate = codePoint\\n\\n continue\\n }\\n\\n // 2 leads in a row\\n if (codePoint \u003C 0xDC00) {\\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\\n leadSurrogate = codePoint\\n continue\\n }\\n\\n // valid surrogate pair\\n codePoint = (leadSurrogate - 0xD800 \u003C\u003C 10 | codePoint - 0xDC00) + 0x10000\\n } else if (leadSurrogate) {\\n // valid bmp char, but last char was a lead\\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\\n }\\n\\n leadSurrogate = null\\n\\n // encode utf8\\n if (codePoint \u003C 0x80) {\\n if ((units -= 1) \u003C 0) break\\n bytes.push(codePoint)\\n } else if (codePoint \u003C 0x800) {\\n if ((units -= 2) \u003C 0) break\\n bytes.push(\\n codePoint >> 0x6 | 0xC0,\\n codePoint & 0x3F | 0x80\\n )\\n } else if (codePoint \u003C 0x10000) {\\n if ((units -= 3) \u003C 0) break\\n bytes.push(\\n codePoint >> 0xC | 0xE0,\\n codePoint >> 0x6 & 0x3F | 0x80,\\n codePoint & 0x3F | 0x80\\n )\\n } else if (codePoint \u003C 0x110000) {\\n if ((units -= 4) \u003C 0) break\\n bytes.push(\\n codePoint >> 0x12 | 0xF0,\\n codePoint >> 0xC & 0x3F | 0x80,\\n codePoint >> 0x6 & 0x3F | 0x80,\\n codePoint & 0x3F | 0x80\\n )\\n } else {\\n throw new Error('Invalid code point')\\n }\\n }\\n\\n return bytes\\n}\\n\\nfunction asciiToBytes (str) {\\n var byteArray = []\\n for (var i = 0; i \u003C str.length; ++i) {\\n // Node's code seems to be doing this and not & 0x7F..\\n byteArray.push(str.charCodeAt(i) & 0xFF)\\n }\\n return byteArray\\n}\\n\\nfunction utf16leToBytes (str, units) {\\n var c, hi, lo\\n var byteArray = []\\n for (var i = 0; i \u003C str.length; ++i) {\\n if ((units -= 2) \u003C 0) break\\n\\n c = str.charCodeAt(i)\\n hi = c >> 8\\n lo = c % 256\\n byteArray.push(lo)\\n byteArray.push(hi)\\n }\\n\\n return byteArray\\n}\\n\\nfunction base64ToBytes (str) {\\n return base64.toByteArray(base64clean(str))\\n}\\n\\nfunction blitBuffer (src, dst, offset, length) {\\n for (var i = 0; i \u003C length; ++i) {\\n if ((i + offset >= dst.length) || (i >= src.length)) break\\n dst[i + offset] = src[i]\\n }\\n return i\\n}\\n\\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\\n// the `instanceof` check but they should be treated as of that type.\\n// See: https://github.com/feross/buffer/issues/166\\nfunction isInstance (obj, type) {\\n return obj instanceof type ||\\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\\n obj.constructor.name === type.name)\\n}\\nfunction numberIsNaN (obj) {\\n // For IE11 support\\n return obj !== obj // eslint-disable-line no-self-compare\\n}\\n\\n}).call(this,require(\\\"buffer\\\").Buffer)\\n},{\\\"base64-js\\\":4,\\\"buffer\\\":5,\\\"ieee754\\\":34}],6:[function(require,module,exports){\\n'use strict'\\n\\nconst mh = require('multihashes')\\nconst { Buffer } = require('buffer')\\nvar CIDUtil = {\\n /**\\n * Test if the given input is a valid CID object.\\n * Returns an error message if it is not.\\n * Returns undefined if it is a valid CID.\\n *\\n * @param {any} other\\n * @returns {string}\\n */\\n checkCIDComponents: function (other) {\\n if (other == null) {\\n return 'null values are not valid CIDs'\\n }\\n\\n if (!(other.version === 0 || other.version === 1)) {\\n return 'Invalid version, must be a number equal to 1 or 0'\\n }\\n\\n if (typeof other.codec !== 'string') {\\n return 'codec must be string'\\n }\\n\\n if (other.version === 0) {\\n if (other.codec !== 'dag-pb') {\\n return \\\"codec must be 'dag-pb' for CIDv0\\\"\\n }\\n if (other.multibaseName !== 'base58btc') {\\n return \\\"multibaseName must be 'base58btc' for CIDv0\\\"\\n }\\n }\\n\\n if (!Buffer.isBuffer(other.multihash)) {\\n return 'multihash must be a Buffer'\\n }\\n\\n try {\\n mh.validate(other.multihash)\\n } catch (err) {\\n let errorMsg = err.message\\n if (!errorMsg) { // Just in case mh.validate() throws an error with empty error message\\n errorMsg = 'Multihash validation failed'\\n }\\n return errorMsg\\n }\\n }\\n}\\n\\nmodule.exports = CIDUtil\\n\\n},{\\\"buffer\\\":5,\\\"multihashes\\\":62}],7:[function(require,module,exports){\\n'use strict'\\n\\nconst { Buffer } = require('buffer')\\nconst mh = require('multihashes')\\nconst multibase = require('multibase')\\nconst multicodec = require('multicodec')\\nconst codecs = require('multicodec/src/base-table.json')\\nconst CIDUtil = require('./cid-util')\\nconst withIs = require('class-is')\\n\\n/**\\n * @typedef {Object} SerializedCID\\n * @param {string} codec\\n * @param {number} version\\n * @param {Buffer} multihash\\n */\\n\\n/**\\n * Test if the given input is a CID.\\n * @function isCID\\n * @memberof CID\\n * @static\\n * @param {any} other\\n * @returns {bool}\\n */\\n\\n/**\\n * Class representing a CID `\u003Cmbase>\u003Cversion>\u003Cmcodec>\u003Cmhash>`\\n * , as defined in [ipld/cid](https://github.com/multiformats/cid).\\n * @class CID\\n */\\nclass CID {\\n /**\\n * Create a new CID.\\n *\\n * The algorithm for argument input is roughly:\\n * ```\\n * if (cid)\\n * -> create a copy\\n * else if (str)\\n * if (1st char is on multibase table) -> CID String\\n * else -> bs58 encoded multihash\\n * else if (Buffer)\\n * if (1st byte is 0 or 1) -> CID\\n * else -> multihash\\n * else if (Number)\\n * -> construct CID by parts\\n * ```\\n *\\n * @param {string|Buffer|CID} version\\n * @param {string} [codec]\\n * @param {Buffer} [multihash]\\n * @param {string} [multibaseName]\\n *\\n * @example\\n * new CID(\u003Cversion>, \u003Ccodec>, \u003Cmultihash>, \u003CmultibaseName>)\\n * new CID(\u003CcidStr>)\\n * new CID(\u003Ccid.buffer>)\\n * new CID(\u003Cmultihash>)\\n * new CID(\u003Cbs58 encoded multihash>)\\n * new CID(\u003Ccid>)\\n */\\n constructor (version, codec, multihash, multibaseName) {\\n if (_CID.isCID(version)) {\\n // version is an exising CID instance\\n const cid = version\\n this.version = cid.version\\n this.codec = cid.codec\\n this.multihash = Buffer.from(cid.multihash)\\n // Default guard for when a CID \u003C 0.7 is passed with no multibaseName\\n this.multibaseName = cid.multibaseName || (cid.version === 0 ? 'base58btc' : 'base32')\\n return\\n }\\n\\n if (typeof version === 'string') {\\n // e.g. 'base32' or false\\n const baseName = multibase.isEncoded(version)\\n if (baseName) {\\n // version is a CID String encoded with multibase, so v1\\n const cid = multibase.decode(version)\\n this.version = parseInt(cid.slice(0, 1).toString('hex'), 16)\\n this.codec = multicodec.getCodec(cid.slice(1))\\n this.multihash = multicodec.rmPrefix(cid.slice(1))\\n this.multibaseName = baseName\\n } else {\\n // version is a base58btc string multihash, so v0\\n this.version = 0\\n this.codec = 'dag-pb'\\n this.multihash = mh.fromB58String(version)\\n this.multibaseName = 'base58btc'\\n }\\n CID.validateCID(this)\\n Object.defineProperty(this, 'string', { value: version })\\n return\\n }\\n\\n if (Buffer.isBuffer(version)) {\\n const firstByte = version.slice(0, 1)\\n const v = parseInt(firstByte.toString('hex'), 16)\\n if (v === 1) {\\n // version is a CID buffer\\n const cid = version\\n this.version = v\\n this.codec = multicodec.getCodec(cid.slice(1))\\n this.multihash = multicodec.rmPrefix(cid.slice(1))\\n this.multibaseName = 'base32'\\n } else {\\n // version is a raw multihash buffer, so v0\\n this.version = 0\\n this.codec = 'dag-pb'\\n this.multihash = version\\n this.multibaseName = 'base58btc'\\n }\\n CID.validateCID(this)\\n return\\n }\\n\\n // otherwise, assemble the CID from the parameters\\n\\n /**\\n * @type {number}\\n */\\n this.version = version\\n\\n /**\\n * @type {string}\\n */\\n this.codec = codec\\n\\n /**\\n * @type {Buffer}\\n */\\n this.multihash = multihash\\n\\n /**\\n * @type {string}\\n */\\n this.multibaseName = multibaseName || (version === 0 ? 'base58btc' : 'base32')\\n\\n CID.validateCID(this)\\n }\\n\\n /**\\n * The CID as a `Buffer`\\n *\\n * @return {Buffer}\\n * @readonly\\n *\\n * @memberOf CID\\n */\\n get buffer () {\\n let buffer = this._buffer\\n\\n if (!buffer) {\\n if (this.version === 0) {\\n buffer = this.multihash\\n } else if (this.version === 1) {\\n buffer = Buffer.concat([\\n Buffer.from('01', 'hex'),\\n multicodec.getCodeVarint(this.codec),\\n this.multihash\\n ])\\n } else {\\n throw new Error('unsupported version')\\n }\\n\\n // Cache this buffer so it doesn't have to be recreated\\n Object.defineProperty(this, '_buffer', { value: buffer })\\n }\\n\\n return buffer\\n }\\n\\n /**\\n * Get the prefix of the CID.\\n *\\n * @returns {Buffer}\\n * @readonly\\n */\\n get prefix () {\\n return Buffer.concat([\\n Buffer.from(`0${this.version}`, 'hex'),\\n multicodec.getCodeVarint(this.codec),\\n mh.prefix(this.multihash)\\n ])\\n }\\n\\n /**\\n * Convert to a CID of version `0`.\\n *\\n * @returns {CID}\\n */\\n toV0 () {\\n if (this.codec !== 'dag-pb') {\\n throw new Error('Cannot convert a non dag-pb CID to CIDv0')\\n }\\n\\n const { name, length } = mh.decode(this.multihash)\\n\\n if (name !== 'sha2-256') {\\n throw new Error('Cannot convert non sha2-256 multihash CID to CIDv0')\\n }\\n\\n if (length !== 32) {\\n throw new Error('Cannot convert non 32 byte multihash CID to CIDv0')\\n }\\n\\n return new _CID(0, this.codec, this.multihash)\\n }\\n\\n /**\\n * Convert to a CID of version `1`.\\n *\\n * @returns {CID}\\n */\\n toV1 () {\\n return new _CID(1, this.codec, this.multihash)\\n }\\n\\n /**\\n * Encode the CID into a string.\\n *\\n * @param {string} [base=this.multibaseName] - Base encoding to use.\\n * @returns {string}\\n */\\n toBaseEncodedString (base = this.multibaseName) {\\n if (this.string && base === this.multibaseName) {\\n return this.string\\n }\\n let str = null\\n if (this.version === 0) {\\n if (base !== 'base58btc') {\\n throw new Error('not supported with CIDv0, to support different bases, please migrate the instance do CIDv1, you can do that through cid.toV1()')\\n }\\n str = mh.toB58String(this.multihash)\\n } else if (this.version === 1) {\\n str = multibase.encode(base, this.buffer).toString()\\n } else {\\n throw new Error('unsupported version')\\n }\\n if (base === this.multibaseName) {\\n // cache the string value\\n Object.defineProperty(this, 'string', { value: str })\\n }\\n return str\\n }\\n\\n /**\\n * CID(QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n)\\n *\\n * @returns {String}\\n */\\n [Symbol.for('nodejs.util.inspect.custom')] () {\\n return 'CID(' + this.toString() + ')'\\n }\\n\\n toString (base) {\\n return this.toBaseEncodedString(base)\\n }\\n\\n /**\\n * Serialize to a plain object.\\n *\\n * @returns {SerializedCID}\\n */\\n toJSON () {\\n return {\\n codec: this.codec,\\n version: this.version,\\n hash: this.multihash\\n }\\n }\\n\\n /**\\n * Compare equality with another CID.\\n *\\n * @param {CID} other\\n * @returns {bool}\\n */\\n equals (other) {\\n return this.codec === other.codec &&\\n this.version === other.version &&\\n this.multihash.equals(other.multihash)\\n }\\n\\n /**\\n * Test if the given input is a valid CID object.\\n * Throws if it is not.\\n *\\n * @param {any} other\\n * @returns {void}\\n */\\n static validateCID (other) {\\n const errorMsg = CIDUtil.checkCIDComponents(other)\\n if (errorMsg) {\\n throw new Error(errorMsg)\\n }\\n }\\n}\\n\\nconst _CID = withIs(CID, {\\n className: 'CID',\\n symbolName: '@ipld/js-cid/CID'\\n})\\n\\n_CID.codecs = codecs\\n\\nmodule.exports = _CID\\n\\n},{\\\"./cid-util\\\":6,\\\"buffer\\\":5,\\\"class-is\\\":8,\\\"multibase\\\":53,\\\"multicodec\\\":56,\\\"multicodec/src/base-table.json\\\":54,\\\"multihashes\\\":62}],8:[function(require,module,exports){\\n'use strict';\\n\\nfunction withIs(Class, { className, symbolName }) {\\n const symbol = Symbol.for(symbolName);\\n\\n const ClassIsWrapper = {\\n // The code below assigns the class wrapper to an object to trick\\n // JavaScript engines to show the name of the extended class when\\n // logging an instances.\\n // We are assigning an anonymous class (class wrapper) to the object\\n // with key `className` to keep the correct name.\\n // If this is not supported it falls back to logging `ClassIsWrapper`.\\n [className]: class extends Class {\\n constructor(...args) {\\n super(...args);\\n Object.defineProperty(this, symbol, { value: true });\\n }\\n\\n get [Symbol.toStringTag]() {\\n return className;\\n }\\n },\\n }[className];\\n\\n ClassIsWrapper[`is${className}`] = (obj) => !!(obj && obj[symbol]);\\n\\n return ClassIsWrapper;\\n}\\n\\nfunction withIsProto(Class, { className, symbolName, withoutNew }) {\\n const symbol = Symbol.for(symbolName);\\n\\n /* eslint-disable object-shorthand */\\n const ClassIsWrapper = {\\n [className]: function (...args) {\\n if (withoutNew && !(this instanceof ClassIsWrapper)) {\\n return new ClassIsWrapper(...args);\\n }\\n\\n const _this = Class.call(this, ...args) || this;\\n\\n if (_this && !_this[symbol]) {\\n Object.defineProperty(_this, symbol, { value: true });\\n }\\n\\n return _this;\\n },\\n }[className];\\n /* eslint-enable object-shorthand */\\n\\n ClassIsWrapper.prototype = Object.create(Class.prototype);\\n ClassIsWrapper.prototype.constructor = ClassIsWrapper;\\n\\n Object.defineProperty(ClassIsWrapper.prototype, Symbol.toStringTag, {\\n get() {\\n return className;\\n },\\n });\\n\\n ClassIsWrapper[`is${className}`] = (obj) => !!(obj && obj[symbol]);\\n\\n return ClassIsWrapper;\\n}\\n\\nmodule.exports = withIs;\\nmodule.exports.proto = withIsProto;\\n\\n},{}],9:[function(require,module,exports){\\nmodule.exports={\\n \\\"identity\\\": 0,\\n \\\"ip4\\\": 4,\\n \\\"tcp\\\": 6,\\n \\\"sha1\\\": 17,\\n \\\"sha2-256\\\": 18,\\n \\\"sha2-512\\\": 19,\\n \\\"sha3-512\\\": 20,\\n \\\"sha3-384\\\": 21,\\n \\\"sha3-256\\\": 22,\\n \\\"sha3-224\\\": 23,\\n \\\"shake-128\\\": 24,\\n \\\"shake-256\\\": 25,\\n \\\"keccak-224\\\": 26,\\n \\\"keccak-256\\\": 27,\\n \\\"keccak-384\\\": 28,\\n \\\"keccak-512\\\": 29,\\n \\\"dccp\\\": 33,\\n \\\"murmur3-128\\\": 34,\\n \\\"murmur3-32\\\": 35,\\n \\\"ip6\\\": 41,\\n \\\"ip6zone\\\": 42,\\n \\\"path\\\": 47,\\n \\\"multicodec\\\": 48,\\n \\\"multihash\\\": 49,\\n \\\"multiaddr\\\": 50,\\n \\\"multibase\\\": 51,\\n \\\"dns\\\": 53,\\n \\\"dns4\\\": 54,\\n \\\"dns6\\\": 55,\\n \\\"dnsaddr\\\": 56,\\n \\\"protobuf\\\": 80,\\n \\\"cbor\\\": 81,\\n \\\"raw\\\": 85,\\n \\\"dbl-sha2-256\\\": 86,\\n \\\"rlp\\\": 96,\\n \\\"bencode\\\": 99,\\n \\\"dag-pb\\\": 112,\\n \\\"dag-cbor\\\": 113,\\n \\\"libp2p-key\\\": 114,\\n \\\"git-raw\\\": 120,\\n \\\"torrent-info\\\": 123,\\n \\\"torrent-file\\\": 124,\\n \\\"leofcoin-block\\\": 129,\\n \\\"leofcoin-tx\\\": 130,\\n \\\"leofcoin-pr\\\": 131,\\n \\\"sctp\\\": 132,\\n \\\"eth-block\\\": 144,\\n \\\"eth-block-list\\\": 145,\\n \\\"eth-tx-trie\\\": 146,\\n \\\"eth-tx\\\": 147,\\n \\\"eth-tx-receipt-trie\\\": 148,\\n \\\"eth-tx-receipt\\\": 149,\\n \\\"eth-state-trie\\\": 150,\\n \\\"eth-account-snapshot\\\": 151,\\n \\\"eth-storage-trie\\\": 152,\\n \\\"bitcoin-block\\\": 176,\\n \\\"bitcoin-tx\\\": 177,\\n \\\"zcash-block\\\": 192,\\n \\\"zcash-tx\\\": 193,\\n \\\"stellar-block\\\": 208,\\n \\\"stellar-tx\\\": 209,\\n \\\"md4\\\": 212,\\n \\\"md5\\\": 213,\\n \\\"bmt\\\": 214,\\n \\\"decred-block\\\": 224,\\n \\\"decred-tx\\\": 225,\\n \\\"ipld-ns\\\": 226,\\n \\\"ipfs-ns\\\": 227,\\n \\\"swarm-ns\\\": 228,\\n \\\"ipns-ns\\\": 229,\\n \\\"zeronet\\\": 230,\\n \\\"ed25519-pub\\\": 237,\\n \\\"dash-block\\\": 240,\\n \\\"dash-tx\\\": 241,\\n \\\"swarm-manifest\\\": 250,\\n \\\"swarm-feed\\\": 251,\\n \\\"udp\\\": 273,\\n \\\"p2p-webrtc-star\\\": 275,\\n \\\"p2p-webrtc-direct\\\": 276,\\n \\\"p2p-stardust\\\": 277,\\n \\\"p2p-circuit\\\": 290,\\n \\\"dag-json\\\": 297,\\n \\\"udt\\\": 301,\\n \\\"utp\\\": 302,\\n \\\"unix\\\": 400,\\n \\\"p2p\\\": 421,\\n \\\"ipfs\\\": 421,\\n \\\"https\\\": 443,\\n \\\"onion\\\": 444,\\n \\\"onion3\\\": 445,\\n \\\"garlic64\\\": 446,\\n \\\"garlic32\\\": 447,\\n \\\"tls\\\": 448,\\n \\\"quic\\\": 460,\\n \\\"ws\\\": 477,\\n \\\"wss\\\": 478,\\n \\\"p2p-websocket-star\\\": 479,\\n \\\"http\\\": 480,\\n \\\"json\\\": 512,\\n \\\"messagepack\\\": 513,\\n \\\"x11\\\": 4352,\\n \\\"blake2b-8\\\": 45569,\\n \\\"blake2b-16\\\": 45570,\\n \\\"blake2b-24\\\": 45571,\\n \\\"blake2b-32\\\": 45572,\\n \\\"blake2b-40\\\": 45573,\\n \\\"blake2b-48\\\": 45574,\\n \\\"blake2b-56\\\": 45575,\\n \\\"blake2b-64\\\": 45576,\\n \\\"blake2b-72\\\": 45577,\\n \\\"blake2b-80\\\": 45578,\\n \\\"blake2b-88\\\": 45579,\\n \\\"blake2b-96\\\": 45580,\\n \\\"blake2b-104\\\": 45581,\\n \\\"blake2b-112\\\": 45582,\\n \\\"blake2b-120\\\": 45583,\\n \\\"blake2b-128\\\": 45584,\\n \\\"blake2b-136\\\": 45585,\\n \\\"blake2b-144\\\": 45586,\\n \\\"blake2b-152\\\": 45587,\\n \\\"blake2b-160\\\": 45588,\\n \\\"blake2b-168\\\": 45589,\\n \\\"blake2b-176\\\": 45590,\\n \\\"blake2b-184\\\": 45591,\\n \\\"blake2b-192\\\": 45592,\\n \\\"blake2b-200\\\": 45593,\\n \\\"blake2b-208\\\": 45594,\\n \\\"blake2b-216\\\": 45595,\\n \\\"blake2b-224\\\": 45596,\\n \\\"blake2b-232\\\": 45597,\\n \\\"blake2b-240\\\": 45598,\\n \\\"blake2b-248\\\": 45599,\\n \\\"blake2b-256\\\": 45600,\\n \\\"blake2b-264\\\": 45601,\\n \\\"blake2b-272\\\": 45602,\\n \\\"blake2b-280\\\": 45603,\\n \\\"blake2b-288\\\": 45604,\\n \\\"blake2b-296\\\": 45605,\\n \\\"blake2b-304\\\": 45606,\\n \\\"blake2b-312\\\": 45607,\\n \\\"blake2b-320\\\": 45608,\\n \\\"blake2b-328\\\": 45609,\\n \\\"blake2b-336\\\": 45610,\\n \\\"blake2b-344\\\": 45611,\\n \\\"blake2b-352\\\": 45612,\\n \\\"blake2b-360\\\": 45613,\\n \\\"blake2b-368\\\": 45614,\\n \\\"blake2b-376\\\": 45615,\\n \\\"blake2b-384\\\": 45616,\\n \\\"blake2b-392\\\": 45617,\\n \\\"blake2b-400\\\": 45618,\\n \\\"blake2b-408\\\": 45619,\\n \\\"blake2b-416\\\": 45620,\\n \\\"blake2b-424\\\": 45621,\\n \\\"blake2b-432\\\": 45622,\\n \\\"blake2b-440\\\": 45623,\\n \\\"blake2b-448\\\": 45624,\\n \\\"blake2b-456\\\": 45625,\\n \\\"blake2b-464\\\": 45626,\\n \\\"blake2b-472\\\": 45627,\\n \\\"blake2b-480\\\": 45628,\\n \\\"blake2b-488\\\": 45629,\\n \\\"blake2b-496\\\": 45630,\\n \\\"blake2b-504\\\": 45631,\\n \\\"blake2b-512\\\": 45632,\\n \\\"blake2s-8\\\": 45633,\\n \\\"blake2s-16\\\": 45634,\\n \\\"blake2s-24\\\": 45635,\\n \\\"blake2s-32\\\": 45636,\\n \\\"blake2s-40\\\": 45637,\\n \\\"blake2s-48\\\": 45638,\\n \\\"blake2s-56\\\": 45639,\\n \\\"blake2s-64\\\": 45640,\\n \\\"blake2s-72\\\": 45641,\\n \\\"blake2s-80\\\": 45642,\\n \\\"blake2s-88\\\": 45643,\\n \\\"blake2s-96\\\": 45644,\\n \\\"blake2s-104\\\": 45645,\\n \\\"blake2s-112\\\": 45646,\\n \\\"blake2s-120\\\": 45647,\\n \\\"blake2s-128\\\": 45648,\\n \\\"blake2s-136\\\": 45649,\\n \\\"blake2s-144\\\": 45650,\\n \\\"blake2s-152\\\": 45651,\\n \\\"blake2s-160\\\": 45652,\\n \\\"blake2s-168\\\": 45653,\\n \\\"blake2s-176\\\": 45654,\\n \\\"blake2s-184\\\": 45655,\\n \\\"blake2s-192\\\": 45656,\\n \\\"blake2s-200\\\": 45657,\\n \\\"blake2s-208\\\": 45658,\\n \\\"blake2s-216\\\": 45659,\\n \\\"blake2s-224\\\": 45660,\\n \\\"blake2s-232\\\": 45661,\\n \\\"blake2s-240\\\": 45662,\\n \\\"blake2s-248\\\": 45663,\\n \\\"blake2s-256\\\": 45664,\\n \\\"skein256-8\\\": 45825,\\n \\\"skein256-16\\\": 45826,\\n \\\"skein256-24\\\": 45827,\\n \\\"skein256-32\\\": 45828,\\n \\\"skein256-40\\\": 45829,\\n \\\"skein256-48\\\": 45830,\\n \\\"skein256-56\\\": 45831,\\n \\\"skein256-64\\\": 45832,\\n \\\"skein256-72\\\": 45833,\\n \\\"skein256-80\\\": 45834,\\n \\\"skein256-88\\\": 45835,\\n \\\"skein256-96\\\": 45836,\\n \\\"skein256-104\\\": 45837,\\n \\\"skein256-112\\\": 45838,\\n \\\"skein256-120\\\": 45839,\\n \\\"skein256-128\\\": 45840,\\n \\\"skein256-136\\\": 45841,\\n \\\"skein256-144\\\": 45842,\\n \\\"skein256-152\\\": 45843,\\n \\\"skein256-160\\\": 45844,\\n \\\"skein256-168\\\": 45845,\\n \\\"skein256-176\\\": 45846,\\n \\\"skein256-184\\\": 45847,\\n \\\"skein256-192\\\": 45848,\\n \\\"skein256-200\\\": 45849,\\n \\\"skein256-208\\\": 45850,\\n \\\"skein256-216\\\": 45851,\\n \\\"skein256-224\\\": 45852,\\n \\\"skein256-232\\\": 45853,\\n \\\"skein256-240\\\": 45854,\\n \\\"skein256-248\\\": 45855,\\n \\\"skein256-256\\\": 45856,\\n \\\"skein512-8\\\": 45857,\\n \\\"skein512-16\\\": 45858,\\n \\\"skein512-24\\\": 45859,\\n \\\"skein512-32\\\": 45860,\\n \\\"skein512-40\\\": 45861,\\n \\\"skein512-48\\\": 45862,\\n \\\"skein512-56\\\": 45863,\\n \\\"skein512-64\\\": 45864,\\n \\\"skein512-72\\\": 45865,\\n \\\"skein512-80\\\": 45866,\\n \\\"skein512-88\\\": 45867,\\n \\\"skein512-96\\\": 45868,\\n \\\"skein512-104\\\": 45869,\\n \\\"skein512-112\\\": 45870,\\n \\\"skein512-120\\\": 45871,\\n \\\"skein512-128\\\": 45872,\\n \\\"skein512-136\\\": 45873,\\n \\\"skein512-144\\\": 45874,\\n \\\"skein512-152\\\": 45875,\\n \\\"skein512-160\\\": 45876,\\n \\\"skein512-168\\\": 45877,\\n \\\"skein512-176\\\": 45878,\\n \\\"skein512-184\\\": 45879,\\n \\\"skein512-192\\\": 45880,\\n \\\"skein512-200\\\": 45881,\\n \\\"skein512-208\\\": 45882,\\n \\\"skein512-216\\\": 45883,\\n \\\"skein512-224\\\": 45884,\\n \\\"skein512-232\\\": 45885,\\n \\\"skein512-240\\\": 45886,\\n \\\"skein512-248\\\": 45887,\\n \\\"skein512-256\\\": 45888,\\n \\\"skein512-264\\\": 45889,\\n \\\"skein512-272\\\": 45890,\\n \\\"skein512-280\\\": 45891,\\n \\\"skein512-288\\\": 45892,\\n \\\"skein512-296\\\": 45893,\\n \\\"skein512-304\\\": 45894,\\n \\\"skein512-312\\\": 45895,\\n \\\"skein512-320\\\": 45896,\\n \\\"skein512-328\\\": 45897,\\n \\\"skein512-336\\\": 45898,\\n \\\"skein512-344\\\": 45899,\\n \\\"skein512-352\\\": 45900,\\n \\\"skein512-360\\\": 45901,\\n \\\"skein512-368\\\": 45902,\\n \\\"skein512-376\\\": 45903,\\n \\\"skein512-384\\\": 45904,\\n \\\"skein512-392\\\": 45905,\\n \\\"skein512-400\\\": 45906,\\n \\\"skein512-408\\\": 45907,\\n \\\"skein512-416\\\": 45908,\\n \\\"skein512-424\\\": 45909,\\n \\\"skein512-432\\\": 45910,\\n \\\"skein512-440\\\": 45911,\\n \\\"skein512-448\\\": 45912,\\n \\\"skein512-456\\\": 45913,\\n \\\"skein512-464\\\": 45914,\\n \\\"skein512-472\\\": 45915,\\n \\\"skein512-480\\\": 45916,\\n \\\"skein512-488\\\": 45917,\\n \\\"skein512-496\\\": 45918,\\n \\\"skein512-504\\\": 45919,\\n \\\"skein512-512\\\": 45920,\\n \\\"skein1024-8\\\": 45921,\\n \\\"skein1024-16\\\": 45922,\\n \\\"skein1024-24\\\": 45923,\\n \\\"skein1024-32\\\": 45924,\\n \\\"skein1024-40\\\": 45925,\\n \\\"skein1024-48\\\": 45926,\\n \\\"skein1024-56\\\": 45927,\\n \\\"skein1024-64\\\": 45928,\\n \\\"skein1024-72\\\": 45929,\\n \\\"skein1024-80\\\": 45930,\\n \\\"skein1024-88\\\": 45931,\\n \\\"skein1024-96\\\": 45932,\\n \\\"skein1024-104\\\": 45933,\\n \\\"skein1024-112\\\": 45934,\\n \\\"skein1024-120\\\": 45935,\\n \\\"skein1024-128\\\": 45936,\\n \\\"skein1024-136\\\": 45937,\\n \\\"skein1024-144\\\": 45938,\\n \\\"skein1024-152\\\": 45939,\\n \\\"skein1024-160\\\": 45940,\\n \\\"skein1024-168\\\": 45941,\\n \\\"skein1024-176\\\": 45942,\\n \\\"skein1024-184\\\": 45943,\\n \\\"skein1024-192\\\": 45944,\\n \\\"skein1024-200\\\": 45945,\\n \\\"skein1024-208\\\": 45946,\\n \\\"skein1024-216\\\": 45947,\\n \\\"skein1024-224\\\": 45948,\\n \\\"skein1024-232\\\": 45949,\\n \\\"skein1024-240\\\": 45950,\\n \\\"skein1024-248\\\": 45951,\\n \\\"skein1024-256\\\": 45952,\\n \\\"skein1024-264\\\": 45953,\\n \\\"skein1024-272\\\": 45954,\\n \\\"skein1024-280\\\": 45955,\\n \\\"skein1024-288\\\": 45956,\\n \\\"skein1024-296\\\": 45957,\\n \\\"skein1024-304\\\": 45958,\\n \\\"skein1024-312\\\": 45959,\\n \\\"skein1024-320\\\": 45960,\\n \\\"skein1024-328\\\": 45961,\\n \\\"skein1024-336\\\": 45962,\\n \\\"skein1024-344\\\": 45963,\\n \\\"skein1024-352\\\": 45964,\\n \\\"skein1024-360\\\": 45965,\\n \\\"skein1024-368\\\": 45966,\\n \\\"skein1024-376\\\": 45967,\\n \\\"skein1024-384\\\": 45968,\\n \\\"skein1024-392\\\": 45969,\\n \\\"skein1024-400\\\": 45970,\\n \\\"skein1024-408\\\": 45971,\\n \\\"skein1024-416\\\": 45972,\\n \\\"skein1024-424\\\": 45973,\\n \\\"skein1024-432\\\": 45974,\\n \\\"skein1024-440\\\": 45975,\\n \\\"skein1024-448\\\": 45976,\\n \\\"skein1024-456\\\": 45977,\\n \\\"skein1024-464\\\": 45978,\\n \\\"skein1024-472\\\": 45979,\\n \\\"skein1024-480\\\": 45980,\\n \\\"skein1024-488\\\": 45981,\\n \\\"skein1024-496\\\": 45982,\\n \\\"skein1024-504\\\": 45983,\\n \\\"skein1024-512\\\": 45984,\\n \\\"skein1024-520\\\": 45985,\\n \\\"skein1024-528\\\": 45986,\\n \\\"skein1024-536\\\": 45987,\\n \\\"skein1024-544\\\": 45988,\\n \\\"skein1024-552\\\": 45989,\\n \\\"skein1024-560\\\": 45990,\\n \\\"skein1024-568\\\": 45991,\\n \\\"skein1024-576\\\": 45992,\\n \\\"skein1024-584\\\": 45993,\\n \\\"skein1024-592\\\": 45994,\\n \\\"skein1024-600\\\": 45995,\\n \\\"skein1024-608\\\": 45996,\\n \\\"skein1024-616\\\": 45997,\\n \\\"skein1024-624\\\": 45998,\\n \\\"skein1024-632\\\": 45999,\\n \\\"skein1024-640\\\": 46000,\\n \\\"skein1024-648\\\": 46001,\\n \\\"skein1024-656\\\": 46002,\\n \\\"skein1024-664\\\": 46003,\\n \\\"skein1024-672\\\": 46004,\\n \\\"skein1024-680\\\": 46005,\\n \\\"skein1024-688\\\": 46006,\\n \\\"skein1024-696\\\": 46007,\\n \\\"skein1024-704\\\": 46008,\\n \\\"skein1024-712\\\": 46009,\\n \\\"skein1024-720\\\": 46010,\\n \\\"skein1024-728\\\": 46011,\\n \\\"skein1024-736\\\": 46012,\\n \\\"skein1024-744\\\": 46013,\\n \\\"skein1024-752\\\": 46014,\\n \\\"skein1024-760\\\": 46015,\\n \\\"skein1024-768\\\": 46016,\\n \\\"skein1024-776\\\": 46017,\\n \\\"skein1024-784\\\": 46018,\\n \\\"skein1024-792\\\": 46019,\\n \\\"skein1024-800\\\": 46020,\\n \\\"skein1024-808\\\": 46021,\\n \\\"skein1024-816\\\": 46022,\\n \\\"skein1024-824\\\": 46023,\\n \\\"skein1024-832\\\": 46024,\\n \\\"skein1024-840\\\": 46025,\\n \\\"skein1024-848\\\": 46026,\\n \\\"skein1024-856\\\": 46027,\\n \\\"skein1024-864\\\": 46028,\\n \\\"skein1024-872\\\": 46029,\\n \\\"skein1024-880\\\": 46030,\\n \\\"skein1024-888\\\": 46031,\\n \\\"skein1024-896\\\": 46032,\\n \\\"skein1024-904\\\": 46033,\\n \\\"skein1024-912\\\": 46034,\\n \\\"skein1024-920\\\": 46035,\\n \\\"skein1024-928\\\": 46036,\\n \\\"skein1024-936\\\": 46037,\\n \\\"skein1024-944\\\": 46038,\\n \\\"skein1024-952\\\": 46039,\\n \\\"skein1024-960\\\": 46040,\\n \\\"skein1024-968\\\": 46041,\\n \\\"skein1024-976\\\": 46042,\\n \\\"skein1024-984\\\": 46043,\\n \\\"skein1024-992\\\": 46044,\\n \\\"skein1024-1000\\\": 46045,\\n \\\"skein1024-1008\\\": 46046,\\n \\\"skein1024-1016\\\": 46047,\\n \\\"skein1024-1024\\\": 46048,\\n \\\"holochain-adr-v0\\\": 8417572,\\n \\\"holochain-adr-v1\\\": 8483108,\\n \\\"holochain-key-v0\\\": 9728292,\\n \\\"holochain-key-v1\\\": 9793828,\\n \\\"holochain-sig-v0\\\": 10645796,\\n \\\"holochain-sig-v1\\\": 10711332\\n}\\n},{}],10:[function(require,module,exports){\\n'use strict'\\n\\nconst table = require('./base-table.json')\\n\\n// map for codecConstant -> code\\nconst constants = {}\\n\\nfor (const [name, code] of Object.entries(table)) {\\n constants[name.toUpperCase().replace(/-/g, '_')] = code\\n}\\n\\nmodule.exports = Object.freeze(constants)\\n\\n},{\\\"./base-table.json\\\":9}],11:[function(require,module,exports){\\n/**\\n * Implementation of the multicodec specification.\\n *\\n * @module multicodec\\n * @example\\n * const multicodec = require('multicodec')\\n *\\n * const prefixedProtobuf = multicodec.addPrefix('protobuf', protobufBuffer)\\n * // prefixedProtobuf 0x50...\\n *\\n */\\n'use strict'\\n\\nconst { Buffer } = require('buffer')\\nconst varint = require('varint')\\nconst intTable = require('./int-table')\\nconst codecNameToCodeVarint = require('./varint-table')\\nconst util = require('./util')\\n\\nexports = module.exports\\n\\n/**\\n * Prefix a buffer with a multicodec-packed.\\n *\\n * @param {string|number} multicodecStrOrCode\\n * @param {Buffer} data\\n * @returns {Buffer}\\n */\\nexports.addPrefix = (multicodecStrOrCode, data) => {\\n let prefix\\n\\n if (Buffer.isBuffer(multicodecStrOrCode)) {\\n prefix = util.varintBufferEncode(multicodecStrOrCode)\\n } else {\\n if (codecNameToCodeVarint[multicodecStrOrCode]) {\\n prefix = codecNameToCodeVarint[multicodecStrOrCode]\\n } else {\\n throw new Error('multicodec not recognized')\\n }\\n }\\n return Buffer.concat([prefix, data])\\n}\\n\\n/**\\n * Decapsulate the multicodec-packed prefix from the data.\\n *\\n * @param {Buffer} data\\n * @returns {Buffer}\\n */\\nexports.rmPrefix = (data) => {\\n varint.decode(data)\\n return data.slice(varint.decode.bytes)\\n}\\n\\n/**\\n * Get the codec of the prefixed data.\\n * @param {Buffer} prefixedData\\n * @returns {string}\\n */\\nexports.getCodec = (prefixedData) => {\\n const code = varint.decode(prefixedData)\\n const codecName = intTable.get(code)\\n if (codecName === undefined) {\\n throw new Error(`Code ${code} not found`)\\n }\\n return codecName\\n}\\n\\n/**\\n * Get the name of the codec.\\n * @param {number} codec\\n * @returns {string}\\n */\\nexports.getName = (codec) => {\\n return intTable.get(codec)\\n}\\n\\n/**\\n * Get the code of the codec\\n * @param {string} name\\n * @returns {number}\\n */\\nexports.getNumber = (name) => {\\n const code = codecNameToCodeVarint[name]\\n if (code === undefined) {\\n throw new Error('Codec `' + name + '` not found')\\n }\\n return util.varintBufferDecode(code)[0]\\n}\\n\\n/**\\n * Get the code of the prefixed data.\\n * @param {Buffer} prefixedData\\n * @returns {number}\\n */\\nexports.getCode = (prefixedData) => {\\n return varint.decode(prefixedData)\\n}\\n\\n/**\\n * Get the code as varint of a codec name.\\n * @param {string} codecName\\n * @returns {Buffer}\\n */\\nexports.getCodeVarint = (codecName) => {\\n const code = codecNameToCodeVarint[codecName]\\n if (code === undefined) {\\n throw new Error('Codec `' + codecName + '` not found')\\n }\\n return code\\n}\\n\\n/**\\n * Get the varint of a code.\\n * @param {Number} code\\n * @returns {Array.\u003Cnumber>}\\n */\\nexports.getVarint = (code) => {\\n return varint.encode(code)\\n}\\n\\n// Make the constants top-level constants\\nconst constants = require('./constants')\\nObject.assign(exports, constants)\\n\\n// Human friendly names for printing, e.g. in error messages\\nexports.print = require('./print')\\n\\n},{\\\"./constants\\\":10,\\\"./int-table\\\":12,\\\"./print\\\":13,\\\"./util\\\":14,\\\"./varint-table\\\":15,\\\"buffer\\\":5,\\\"varint\\\":67}],12:[function(require,module,exports){\\n'use strict'\\nconst baseTable = require('./base-table.json')\\n\\n// map for hexString -> codecName\\nconst nameTable = new Map()\\n\\nfor (const encodingName in baseTable) {\\n const code = baseTable[encodingName]\\n nameTable.set(code, encodingName)\\n}\\n\\nmodule.exports = Object.freeze(nameTable)\\n\\n},{\\\"./base-table.json\\\":9}],13:[function(require,module,exports){\\n'use strict'\\n\\nconst table = require('./base-table.json')\\n\\n// map for code -> print friendly name\\nconst tableByCode = {}\\n\\nfor (const [name, code] of Object.entries(table)) {\\n if (tableByCode[code] === undefined) tableByCode[code] = name\\n}\\n\\nmodule.exports = Object.freeze(tableByCode)\\n\\n},{\\\"./base-table.json\\\":9}],14:[function(require,module,exports){\\n'use strict'\\nconst varint = require('varint')\\nconst { Buffer } = require('buffer')\\n\\nmodule.exports = {\\n numberToBuffer,\\n bufferToNumber,\\n varintBufferEncode,\\n varintBufferDecode,\\n varintEncode\\n}\\n\\nfunction bufferToNumber (buf) {\\n return parseInt(buf.toString('hex'), 16)\\n}\\n\\nfunction numberToBuffer (num) {\\n let hexString = num.toString(16)\\n if (hexString.length % 2 === 1) {\\n hexString = '0' + hexString\\n }\\n return Buffer.from(hexString, 'hex')\\n}\\n\\nfunction varintBufferEncode (input) {\\n return Buffer.from(varint.encode(bufferToNumber(input)))\\n}\\n\\nfunction varintBufferDecode (input) {\\n return numberToBuffer(varint.decode(input))\\n}\\n\\nfunction varintEncode (num) {\\n return Buffer.from(varint.encode(num))\\n}\\n\\n},{\\\"buffer\\\":5,\\\"varint\\\":67}],15:[function(require,module,exports){\\n'use strict'\\n\\nconst baseTable = require('./base-table.json')\\nconst varintEncode = require('./util').varintEncode\\n\\n// map for codecName -> codeVarintBuffer\\nconst varintTable = {}\\n\\nfor (const encodingName in baseTable) {\\n const code = baseTable[encodingName]\\n varintTable[encodingName] = varintEncode(code)\\n}\\n\\nmodule.exports = Object.freeze(varintTable)\\n\\n},{\\\"./base-table.json\\\":9,\\\"./util\\\":14}],16:[function(require,module,exports){\\narguments[4][6][0].apply(exports,arguments)\\n},{\\\"buffer\\\":5,\\\"dup\\\":6,\\\"multihashes\\\":62}],17:[function(require,module,exports){\\narguments[4][7][0].apply(exports,arguments)\\n},{\\\"./cid-util\\\":16,\\\"buffer\\\":5,\\\"class-is\\\":8,\\\"dup\\\":7,\\\"multibase\\\":23,\\\"multicodec\\\":11,\\\"multicodec/src/base-table.json\\\":9,\\\"multihashes\\\":62}],18:[function(require,module,exports){\\n'use strict'\\n\\nclass Base {\\n constructor (name, code, implementation, alphabet) {\\n this.name = name\\n this.code = code\\n this.alphabet = alphabet\\n if (implementation && alphabet) {\\n this.engine = implementation(alphabet)\\n }\\n }\\n\\n encode (stringOrBuffer) {\\n return this.engine.encode(stringOrBuffer)\\n }\\n\\n decode (stringOrBuffer) {\\n return this.engine.decode(stringOrBuffer)\\n }\\n\\n isImplemented () {\\n return this.engine\\n }\\n}\\n\\nmodule.exports = Base\\n\\n},{}],19:[function(require,module,exports){\\n'use strict'\\nconst { Buffer } = require('buffer')\\n\\nmodule.exports = function base16 (alphabet) {\\n return {\\n encode (input) {\\n if (typeof input === 'string') {\\n return Buffer.from(input).toString('hex')\\n }\\n return input.toString('hex')\\n },\\n decode (input) {\\n for (const char of input) {\\n if (alphabet.indexOf(char) \u003C 0) {\\n throw new Error('invalid base16 character')\\n }\\n }\\n return Buffer.from(input, 'hex')\\n }\\n }\\n}\\n\\n},{\\\"buffer\\\":5}],20:[function(require,module,exports){\\n'use strict'\\n\\nfunction decode (input, alphabet) {\\n input = input.replace(new RegExp('=', 'g'), '')\\n const length = input.length\\n\\n let bits = 0\\n let value = 0\\n\\n let index = 0\\n const output = new Uint8Array((length * 5 / 8) | 0)\\n\\n for (let i = 0; i \u003C length; i++) {\\n value = (value \u003C\u003C 5) | alphabet.indexOf(input[i])\\n bits += 5\\n\\n if (bits >= 8) {\\n output[index++] = (value >>> (bits - 8)) & 255\\n bits -= 8\\n }\\n }\\n\\n return output.buffer\\n}\\n\\nfunction encode (buffer, alphabet) {\\n const length = buffer.byteLength\\n const view = new Uint8Array(buffer)\\n const padding = alphabet.indexOf('=') === alphabet.length - 1\\n\\n if (padding) {\\n alphabet = alphabet.substring(0, alphabet.length - 1)\\n }\\n\\n let bits = 0\\n let value = 0\\n let output = ''\\n\\n for (let i = 0; i \u003C length; i++) {\\n value = (value \u003C\u003C 8) | view[i]\\n bits += 8\\n\\n while (bits >= 5) {\\n output += alphabet[(value >>> (bits - 5)) & 31]\\n bits -= 5\\n }\\n }\\n\\n if (bits > 0) {\\n output += alphabet[(value \u003C\u003C (5 - bits)) & 31]\\n }\\n\\n if (padding) {\\n while ((output.length % 8) !== 0) {\\n output += '='\\n }\\n }\\n\\n return output\\n}\\n\\nmodule.exports = function base32 (alphabet) {\\n return {\\n encode (input) {\\n if (typeof input === 'string') {\\n return encode(Uint8Array.from(input), alphabet)\\n }\\n\\n return encode(input, alphabet)\\n },\\n decode (input) {\\n for (const char of input) {\\n if (alphabet.indexOf(char) \u003C 0) {\\n throw new Error('invalid base32 character')\\n }\\n }\\n\\n return decode(input, alphabet)\\n }\\n }\\n}\\n\\n},{}],21:[function(require,module,exports){\\n'use strict'\\nconst { Buffer } = require('buffer')\\n\\nmodule.exports = function base64 (alphabet) {\\n // The alphabet is only used to know:\\n // 1. If padding is enabled (must contain '=')\\n // 2. If the output must be url-safe (must contain '-' and '_')\\n // 3. If the input of the output function is valid\\n // The alphabets from RFC 4648 are always used.\\n const padding = alphabet.indexOf('=') > -1\\n const url = alphabet.indexOf('-') > -1 && alphabet.indexOf('_') > -1\\n\\n return {\\n encode (input) {\\n let output = ''\\n\\n if (typeof input === 'string') {\\n output = Buffer.from(input).toString('base64')\\n } else {\\n output = input.toString('base64')\\n }\\n\\n if (url) {\\n output = output.replace(/\\\\+/g, '-').replace(/\\\\//g, '_')\\n }\\n\\n const pad = output.indexOf('=')\\n if (pad > 0 && !padding) {\\n output = output.substring(0, pad)\\n }\\n\\n return output\\n },\\n decode (input) {\\n for (const char of input) {\\n if (alphabet.indexOf(char) \u003C 0) {\\n throw new Error('invalid base64 character')\\n }\\n }\\n\\n return Buffer.from(input, 'base64')\\n }\\n }\\n}\\n\\n},{\\\"buffer\\\":5}],22:[function(require,module,exports){\\n'use strict'\\n\\nconst Base = require('./base.js')\\nconst baseX = require('base-x')\\nconst base16 = require('./base16')\\nconst base32 = require('./base32')\\nconst base64 = require('./base64')\\n\\n// name, code, implementation, alphabet\\nconst constants = [\\n ['base1', '1', '', '1'],\\n ['base2', '0', baseX, '01'],\\n ['base8', '7', baseX, '01234567'],\\n ['base10', '9', baseX, '0123456789'],\\n ['base16', 'f', base16, '0123456789abcdef'],\\n ['base32', 'b', base32, 'abcdefghijklmnopqrstuvwxyz234567'],\\n ['base32pad', 'c', base32, 'abcdefghijklmnopqrstuvwxyz234567='],\\n ['base32hex', 'v', base32, '0123456789abcdefghijklmnopqrstuv'],\\n ['base32hexpad', 't', base32, '0123456789abcdefghijklmnopqrstuv='],\\n ['base32z', 'h', base32, 'ybndrfg8ejkmcpqxot1uwisza345h769'],\\n ['base58flickr', 'Z', baseX, '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'],\\n ['base58btc', 'z', baseX, '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'],\\n ['base64', 'm', base64, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'],\\n ['base64pad', 'M', base64, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='],\\n ['base64url', 'u', base64, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'],\\n ['base64urlpad', 'U', base64, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=']\\n]\\n\\nconst names = constants.reduce((prev, tupple) => {\\n prev[tupple[0]] = new Base(tupple[0], tupple[1], tupple[2], tupple[3])\\n return prev\\n}, {})\\n\\nconst codes = constants.reduce((prev, tupple) => {\\n prev[tupple[1]] = names[tupple[0]]\\n return prev\\n}, {})\\n\\nmodule.exports = {\\n names: names,\\n codes: codes\\n}\\n\\n},{\\\"./base.js\\\":18,\\\"./base16\\\":19,\\\"./base32\\\":20,\\\"./base64\\\":21,\\\"base-x\\\":3}],23:[function(require,module,exports){\\n/**\\n * Implementation of the [multibase](https://github.com/multiformats/multibase) specification.\\n * @module Multibase\\n */\\n'use strict'\\n\\nconst { Buffer } = require('buffer')\\nconst constants = require('./constants')\\n\\nexports = module.exports = multibase\\nexports.encode = encode\\nexports.decode = decode\\nexports.isEncoded = isEncoded\\nexports.names = Object.freeze(Object.keys(constants.names))\\nexports.codes = Object.freeze(Object.keys(constants.codes))\\n\\nconst errNotSupported = new Error('Unsupported encoding')\\n\\n/**\\n * Create a new buffer with the multibase varint+code.\\n *\\n * @param {string|number} nameOrCode - The multibase name or code number.\\n * @param {Buffer} buf - The data to be prefixed with multibase.\\n * @memberof Multibase\\n * @returns {Buffer}\\n */\\nfunction multibase (nameOrCode, buf) {\\n if (!buf) {\\n throw new Error('requires an encoded buffer')\\n }\\n const base = getBase(nameOrCode)\\n const codeBuf = Buffer.from(base.code)\\n\\n const name = base.name\\n validEncode(name, buf)\\n return Buffer.concat([codeBuf, buf])\\n}\\n\\n/**\\n * Encode data with the specified base and add the multibase prefix.\\n *\\n * @param {string|number} nameOrCode - The multibase name or code number.\\n * @param {Buffer} buf - The data to be encoded.\\n * @returns {Buffer}\\n * @memberof Multibase\\n */\\nfunction encode (nameOrCode, buf) {\\n const base = getBase(nameOrCode)\\n const name = base.name\\n\\n return multibase(name, Buffer.from(base.encode(buf)))\\n}\\n\\n/**\\n * Takes a buffer or string encoded with multibase header, decodes it and\\n * returns the decoded buffer\\n *\\n * @param {Buffer|string} bufOrString\\n * @returns {Buffer}\\n * @memberof Multibase\\n *\\n */\\nfunction decode (bufOrString) {\\n if (Buffer.isBuffer(bufOrString)) {\\n bufOrString = bufOrString.toString()\\n }\\n\\n const code = bufOrString.substring(0, 1)\\n bufOrString = bufOrString.substring(1, bufOrString.length)\\n\\n if (typeof bufOrString === 'string') {\\n bufOrString = Buffer.from(bufOrString)\\n }\\n\\n const base = getBase(code)\\n return Buffer.from(base.decode(bufOrString.toString()))\\n}\\n\\n/**\\n * Is the given data multibase encoded?\\n *\\n * @param {Buffer|string} bufOrString\\n * @returns {boolean}\\n * @memberof Multibase\\n */\\nfunction isEncoded (bufOrString) {\\n if (Buffer.isBuffer(bufOrString)) {\\n bufOrString = bufOrString.toString()\\n }\\n\\n // Ensure bufOrString is a string\\n if (Object.prototype.toString.call(bufOrString) !== '[object String]') {\\n return false\\n }\\n\\n const code = bufOrString.substring(0, 1)\\n try {\\n const base = getBase(code)\\n return base.name\\n } catch (err) {\\n return false\\n }\\n}\\n\\n/**\\n * @param {string} name\\n * @param {Buffer} buf\\n * @private\\n * @returns {undefined}\\n */\\nfunction validEncode (name, buf) {\\n const base = getBase(name)\\n base.decode(buf.toString())\\n}\\n\\nfunction getBase (nameOrCode) {\\n let base\\n\\n if (constants.names[nameOrCode]) {\\n base = constants.names[nameOrCode]\\n } else if (constants.codes[nameOrCode]) {\\n base = constants.codes[nameOrCode]\\n } else {\\n throw errNotSupported\\n }\\n\\n if (!base.isImplemented()) {\\n throw new Error('Base ' + nameOrCode + ' is not implemented yet')\\n }\\n\\n return base\\n}\\n\\n},{\\\"./constants\\\":22,\\\"buffer\\\":5}],24:[function(require,module,exports){\\narguments[4][9][0].apply(exports,arguments)\\n},{\\\"dup\\\":9}],25:[function(require,module,exports){\\narguments[4][10][0].apply(exports,arguments)\\n},{\\\"./base-table.json\\\":24,\\\"dup\\\":10}],26:[function(require,module,exports){\\n(function (Buffer){\\n/**\\n * Implementation of the multicodec specification.\\n *\\n * @module multicodec\\n * @example\\n * const multicodec = require('multicodec')\\n *\\n * const prefixedProtobuf = multicodec.addPrefix('protobuf', protobufBuffer)\\n * // prefixedProtobuf 0x50...\\n *\\n */\\n'use strict'\\n\\nconst varint = require('varint')\\nconst intTable = require('./int-table')\\nconst codecNameToCodeVarint = require('./varint-table')\\nconst util = require('./util')\\n\\nexports = module.exports\\n\\n/**\\n * Prefix a buffer with a multicodec-packed.\\n *\\n * @param {string|number} multicodecStrOrCode\\n * @param {Buffer} data\\n * @returns {Buffer}\\n */\\nexports.addPrefix = (multicodecStrOrCode, data) => {\\n let prefix\\n\\n if (Buffer.isBuffer(multicodecStrOrCode)) {\\n prefix = util.varintBufferEncode(multicodecStrOrCode)\\n } else {\\n if (codecNameToCodeVarint[multicodecStrOrCode]) {\\n prefix = codecNameToCodeVarint[multicodecStrOrCode]\\n } else {\\n throw new Error('multicodec not recognized')\\n }\\n }\\n return Buffer.concat([prefix, data])\\n}\\n\\n/**\\n * Decapsulate the multicodec-packed prefix from the data.\\n *\\n * @param {Buffer} data\\n * @returns {Buffer}\\n */\\nexports.rmPrefix = (data) => {\\n varint.decode(data)\\n return data.slice(varint.decode.bytes)\\n}\\n\\n/**\\n * Get the codec of the prefixed data.\\n * @param {Buffer} prefixedData\\n * @returns {string}\\n */\\nexports.getCodec = (prefixedData) => {\\n const code = varint.decode(prefixedData)\\n const codecName = intTable.get(code)\\n if (codecName === undefined) {\\n throw new Error(`Code ${code} not found`)\\n }\\n return codecName\\n}\\n\\n/**\\n * Get the name of the codec.\\n * @param {number} codec\\n * @returns {string}\\n */\\nexports.getName = (codec) => {\\n return intTable.get(codec)\\n}\\n\\n/**\\n * Get the code of the codec\\n * @param {string} name\\n * @returns {number}\\n */\\nexports.getNumber = (name) => {\\n const code = codecNameToCodeVarint[name]\\n if (code === undefined) {\\n throw new Error('Codec `' + name + '` not found')\\n }\\n return util.varintBufferDecode(code)[0]\\n}\\n\\n/**\\n * Get the code of the prefixed data.\\n * @param {Buffer} prefixedData\\n * @returns {number}\\n */\\nexports.getCode = (prefixedData) => {\\n return varint.decode(prefixedData)\\n}\\n\\n/**\\n * Get the code as varint of a codec name.\\n * @param {string} codecName\\n * @returns {Buffer}\\n */\\nexports.getCodeVarint = (codecName) => {\\n const code = codecNameToCodeVarint[codecName]\\n if (code === undefined) {\\n throw new Error('Codec `' + codecName + '` not found')\\n }\\n return code\\n}\\n\\n/**\\n * Get the varint of a code.\\n * @param {Number} code\\n * @returns {Array.\u003Cnumber>}\\n */\\nexports.getVarint = (code) => {\\n return varint.encode(code)\\n}\\n\\n// Make the constants top-level constants\\nconst constants = require('./constants')\\nObject.assign(exports, constants)\\n\\n// Human friendly names for printing, e.g. in error messages\\nexports.print = require('./print')\\n\\n}).call(this,require(\\\"buffer\\\").Buffer)\\n},{\\\"./constants\\\":25,\\\"./int-table\\\":27,\\\"./print\\\":28,\\\"./util\\\":29,\\\"./varint-table\\\":30,\\\"buffer\\\":5,\\\"varint\\\":67}],27:[function(require,module,exports){\\narguments[4][12][0].apply(exports,arguments)\\n},{\\\"./base-table.json\\\":24,\\\"dup\\\":12}],28:[function(require,module,exports){\\narguments[4][13][0].apply(exports,arguments)\\n},{\\\"./base-table.json\\\":24,\\\"dup\\\":13}],29:[function(require,module,exports){\\n(function (Buffer){\\n'use strict'\\nconst varint = require('varint')\\n\\nmodule.exports = {\\n numberToBuffer,\\n bufferToNumber,\\n varintBufferEncode,\\n varintBufferDecode,\\n varintEncode\\n}\\n\\nfunction bufferToNumber (buf) {\\n return parseInt(buf.toString('hex'), 16)\\n}\\n\\nfunction numberToBuffer (num) {\\n let hexString = num.toString(16)\\n if (hexString.length % 2 === 1) {\\n hexString = '0' + hexString\\n }\\n return Buffer.from(hexString, 'hex')\\n}\\n\\nfunction varintBufferEncode (input) {\\n return Buffer.from(varint.encode(bufferToNumber(input)))\\n}\\n\\nfunction varintBufferDecode (input) {\\n return numberToBuffer(varint.decode(input))\\n}\\n\\nfunction varintEncode (num) {\\n return Buffer.from(varint.encode(num))\\n}\\n\\n}).call(this,require(\\\"buffer\\\").Buffer)\\n},{\\\"buffer\\\":5,\\\"varint\\\":67}],30:[function(require,module,exports){\\narguments[4][15][0].apply(exports,arguments)\\n},{\\\"./base-table.json\\\":24,\\\"./util\\\":29,\\\"dup\\\":15}],31:[function(require,module,exports){\\n/*\\r\\n\\tISC License\\r\\n\\r\\n\\tCopyright (c) 2019, Pierre-Louis Despaigne\\r\\n\\r\\n\\tPermission to use, copy, modify, and/or distribute this software for any\\r\\n\\tpurpose with or without fee is hereby granted, provided that the above\\r\\n\\tcopyright notice and this permission notice appear in all copies.\\r\\n\\r\\n\\tTHE SOFTWARE IS PROVIDED \\\"AS IS\\\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\\r\\n\\tWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\\r\\n\\tMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\\r\\n\\tANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\\r\\n\\tWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\\r\\n\\tACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\\r\\n\\tOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\\r\\n*/\\r\\n\\r\\nconst CID = require('cids');\\r\\n\\r\\n/**\\r\\n * Take any ipfsHash and convert it to a CID v1 encoded in base32.\\r\\n * @param {string} ipfsHash a regular ipfs hash either a cid v0 or v1 (v1 will remain unchanged)\\r\\n * @return {string} the resulting ipfs hash as a cid v1\\r\\n */\\r\\nconst cidV0ToV1Base32 = (ipfsHash) => {\\r\\n\\tlet cid = new CID(ipfsHash);\\r\\n\\tif (cid.version === 0) {\\r\\n\\t\\tcid = cid.toV1();\\r\\n\\t}\\r\\n\\treturn cid.toString('base32');\\r\\n}\\r\\n\\r\\nexports.cidV0ToV1Base32 = cidV0ToV1Base32;\\r\\n\\n},{\\\"cids\\\":17}],32:[function(require,module,exports){\\n/*\\r\\n\\tISC License\\r\\n\\r\\n\\tCopyright (c) 2019, Pierre-Louis Despaigne\\r\\n\\r\\n\\tPermission to use, copy, modify, and/or distribute this software for any\\r\\n\\tpurpose with or without fee is hereby granted, provided that the above\\r\\n\\tcopyright notice and this permission notice appear in all copies.\\r\\n\\r\\n\\tTHE SOFTWARE IS PROVIDED \\\"AS IS\\\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\\r\\n\\tWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\\r\\n\\tMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\\r\\n\\tANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\\r\\n\\tWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\\r\\n\\tACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\\r\\n\\tOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\\r\\n*/\\r\\n\\r\\nconst multiC = require('multicodec');\\r\\n\\r\\nconst { hexStringToBuffer, profiles } = require('./profiles');\\r\\nconst { cidV0ToV1Base32 } = require('./helpers');\\r\\n\\r\\nmodule.exports = {\\r\\n\\r\\n\\t//export some helpers functions\\r\\n\\thelpers: {\\r\\n\\t\\tcidV0ToV1Base32,\\r\\n\\t},\\r\\n\\r\\n\\t/**\\r\\n\\t* Decode a Content Hash.\\r\\n\\t* @param {string} hash an hex string containing a content hash\\r\\n\\t* @return {string} the decoded content\\r\\n\\t*/\\r\\n\\tdecode: function (contentHash) {\\r\\n\\t\\tconst buffer = hexStringToBuffer(contentHash);\\r\\n\\t\\tconst codec = multiC.getCodec(buffer);\\r\\n\\t\\tconst value = multiC.rmPrefix(buffer);\\r\\n\\t\\tlet profile = profiles[codec];\\r\\n\\t\\tif (!profile) profile = profiles['default'];\\r\\n\\t\\treturn profile.decode(value);\\r\\n\\t},\\r\\n\\r\\n\\t/**\\r\\n\\t* Encode an IPFS address into a content hash\\r\\n\\t* @param {string} ipfsHash string containing an IPFS address\\r\\n\\t* @return {string} the resulting content hash\\r\\n\\t*/\\r\\n\\tfromIpfs: function (ipfsHash) {\\r\\n\\t\\treturn this.encode('ipfs-ns', ipfsHash);\\r\\n\\t},\\r\\n\\r\\n\\t/**\\r\\n\\t* Encode a Swarm address into a content hash\\r\\n\\t* @param {string} swarmHash string containing a Swarm address\\r\\n\\t* @return {string} the resulting content hash\\r\\n\\t*/\\r\\n\\tfromSwarm: function (swarmHash) {\\r\\n\\t\\treturn this.encode('swarm-ns', swarmHash);\\r\\n\\t},\\r\\n\\r\\n\\t/**\\r\\n\\t* General purpose encoding function\\r\\n * @param {string} codec \\r\\n * @param {string} value \\r\\n */\\r\\n\\tencode: function (codec, value) {\\r\\n\\t\\tlet profile = profiles[codec];\\r\\n\\t\\tif (!profile) profile = profiles['default'];\\r\\n\\t\\tconst encodedValue = profile.encode(value);\\r\\n\\t\\treturn multiC.addPrefix(codec, encodedValue).toString('hex');\\r\\n\\t},\\r\\n\\r\\n\\t/**\\r\\n\\t* Extract the codec of a content hash\\r\\n\\t* @param {string} hash hex string containing a content hash\\r\\n\\t* @return {string} the extracted codec\\r\\n\\t*/\\r\\n\\tgetCodec: function (hash) {\\r\\n\\t\\tlet buffer = hexStringToBuffer(hash);\\r\\n\\t\\treturn multiC.getCodec(buffer);\\r\\n\\t},\\r\\n}\\r\\n\\n},{\\\"./helpers\\\":31,\\\"./profiles\\\":33,\\\"multicodec\\\":26}],33:[function(require,module,exports){\\n(function (Buffer){\\n/*\\r\\n\\tISC License\\r\\n\\r\\n\\tCopyright (c) 2019, Pierre-Louis Despaigne\\r\\n\\r\\n\\tPermission to use, copy, modify, and/or distribute this software for any\\r\\n\\tpurpose with or without fee is hereby granted, provided that the above\\r\\n\\tcopyright notice and this permission notice appear in all copies.\\r\\n\\r\\n\\tTHE SOFTWARE IS PROVIDED \\\"AS IS\\\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\\r\\n\\tWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\\r\\n\\tMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\\r\\n\\tANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\\r\\n\\tWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\\r\\n\\tACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\\r\\n\\tOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\\r\\n*/\\r\\n\\r\\nconst CID = require('cids');\\r\\nconst multiH = require('multihashes');\\r\\n\\r\\n/**\\r\\n * Convert an hexadecimal string to a Buffer, the string can start with or without '0x'\\r\\n * @param {string} hex an hexadecimal value\\r\\n * @return {Buffer} the resulting Buffer\\r\\n */\\r\\nconst hexStringToBuffer = (hex) => {\\r\\n\\tlet prefix = hex.slice(0, 2);\\r\\n\\tlet value = hex.slice(2);\\r\\n\\tlet res = '';\\r\\n\\tif (prefix === '0x') res = value;\\r\\n\\telse res = hex;\\r\\n\\treturn multiH.fromHexString(res);\\r\\n}\\r\\n\\r\\n/**\\r\\n* list of known encoding,\\r\\n* encoding should be a function that takes a `string` input,\\r\\n* and return a `Buffer` result\\r\\n*/\\r\\nconst encodes = {\\r\\n /**\\r\\n * @param {string} value\\r\\n * @return {Buffer}\\r\\n */\\r\\n swarm: (value) => {\\r\\n const multihash = multiH.encode(hexStringToBuffer(value), 'keccak-256');\\r\\n\\t\\treturn new CID(1, 'swarm-manifest', multihash).buffer;\\r\\n },\\r\\n /**\\r\\n * @param {string} value\\r\\n * @return {Buffer}\\r\\n */\\r\\n ipfs: (value) => {\\r\\n const multihash = multiH.fromB58String(value);\\r\\n return new CID(1, 'dag-pb', multihash).buffer;\\r\\n },\\r\\n /**\\r\\n * @param {string} value\\r\\n * @return {Buffer}\\r\\n */\\r\\n utf8: (value) => {\\r\\n return Buffer.from(value, 'utf8');\\r\\n },\\r\\n};\\r\\n\\r\\n/** \\r\\n* list of known decoding,\\r\\n* decoding should be a function that takes a `Buffer` input,\\r\\n* and return a `string` result\\r\\n*/\\r\\nconst decodes = {\\r\\n /**\\r\\n * @param {Buffer} value \\r\\n */\\r\\n hexMultiHash: (value) => {\\r\\n const cid = new CID(value);\\r\\n return multiH.decode(cid.multihash).digest.toString('hex');\\r\\n },\\r\\n /**\\r\\n * @param {Buffer} value \\r\\n */\\r\\n b58MultiHash: (value) => {\\r\\n const cid = new CID(value);\\r\\n return multiH.toB58String(cid.multihash);\\r\\n },\\r\\n /**\\r\\n * @param {Buffer} value \\r\\n */\\r\\n utf8: (value) => {\\r\\n return value.toString('utf8');\\r\\n },\\r\\n};\\r\\n\\r\\n/**\\r\\n* list of known encoding/decoding for a given codec,\\r\\n* `encode` should be chosen among the `encodes` functions\\r\\n* `decode` should be chosen among the `decodes` functions\\r\\n*/\\r\\nconst profiles = {\\r\\n 'swarm-ns': {\\r\\n encode: encodes.swarm,\\r\\n decode: decodes.hexMultiHash,\\r\\n },\\r\\n 'ipfs-ns': {\\r\\n encode: encodes.ipfs,\\r\\n decode: decodes.b58MultiHash,\\r\\n },\\r\\n 'ipns-ns': {\\r\\n encode: encodes.ipfs,\\r\\n decode: decodes.b58MultiHash,\\r\\n },\\r\\n 'default': {\\r\\n encode: encodes.utf8,\\r\\n decode: decodes.utf8,\\r\\n },\\r\\n};\\r\\n\\r\\nexports.hexStringToBuffer = hexStringToBuffer;\\r\\nexports.profiles = profiles;\\n}).call(this,require(\\\"buffer\\\").Buffer)\\n},{\\\"buffer\\\":5,\\\"cids\\\":17,\\\"multihashes\\\":62}],34:[function(require,module,exports){\\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\\n var e, m\\n var eLen = (nBytes * 8) - mLen - 1\\n var eMax = (1 \u003C\u003C eLen) - 1\\n var eBias = eMax >> 1\\n var nBits = -7\\n var i = isLE ? (nBytes - 1) : 0\\n var d = isLE ? -1 : 1\\n var s = buffer[offset + i]\\n\\n i += d\\n\\n e = s & ((1 \u003C\u003C (-nBits)) - 1)\\n s >>= (-nBits)\\n nBits += eLen\\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\\n\\n m = e & ((1 \u003C\u003C (-nBits)) - 1)\\n e >>= (-nBits)\\n nBits += mLen\\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\\n\\n if (e === 0) {\\n e = 1 - eBias\\n } else if (e === eMax) {\\n return m ? NaN : ((s ? -1 : 1) * Infinity)\\n } else {\\n m = m + Math.pow(2, mLen)\\n e = e - eBias\\n }\\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\\n}\\n\\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\\n var e, m, c\\n var eLen = (nBytes * 8) - mLen - 1\\n var eMax = (1 \u003C\u003C eLen) - 1\\n var eBias = eMax >> 1\\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\\n var i = isLE ? 0 : (nBytes - 1)\\n var d = isLE ? 1 : -1\\n var s = value \u003C 0 || (value === 0 && 1 / value \u003C 0) ? 1 : 0\\n\\n value = Math.abs(value)\\n\\n if (isNaN(value) || value === Infinity) {\\n m = isNaN(value) ? 1 : 0\\n e = eMax\\n } else {\\n e = Math.floor(Math.log(value) / Math.LN2)\\n if (value * (c = Math.pow(2, -e)) \u003C 1) {\\n e--\\n c *= 2\\n }\\n if (e + eBias >= 1) {\\n value += rt / c\\n } else {\\n value += rt * Math.pow(2, 1 - eBias)\\n }\\n if (value * c >= 2) {\\n e++\\n c /= 2\\n }\\n\\n if (e + eBias >= eMax) {\\n m = 0\\n e = eMax\\n } else if (e + eBias >= 1) {\\n m = ((value * c) - 1) * Math.pow(2, mLen)\\n e = e + eBias\\n } else {\\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\\n e = 0\\n }\\n }\\n\\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\\n\\n e = (e \u003C\u003C mLen) | m\\n eLen += mLen\\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\\n\\n buffer[offset + i - d] |= s * 128\\n}\\n\\n},{}],35:[function(require,module,exports){\\n'use strict'\\n\\nmodule.exports = {\\n DEFAULT_HTTP_API: '/ip4/127.0.0.1/tcp/5001'\\n}\\n\\n},{}],36:[function(require,module,exports){\\n'use strict'\\n\\nmodule.exports = {\\n httpClient: 'httpClient',\\n windowIpfs: 'windowIpfs',\\n jsIpfs: 'jsIpfs',\\n webExt: 'webExt'\\n}\\n\\n},{}],37:[function(require,module,exports){\\n(function (global){\\n'use strict'\\n/* global self */\\n\\n// Establish the root object, `window` in the browser, `self` in Service Worker. or `global` on the server.\\n// Credit: https://github.com/megawac/underscore/commit/365311c9a440438531ca1c6bfd49e3c7c5f46079\\nmodule.exports = (typeof self === 'object' && self.self === self && self) ||\\n (typeof global === 'object' && global.global === global && global) ||\\n this\\n\\n}).call(this,typeof global !== \\\"undefined\\\" ? global : typeof self !== \\\"undefined\\\" ? self : typeof window !== \\\"undefined\\\" ? window : {})\\n},{}],38:[function(require,module,exports){\\n'use strict'\\n\\nconst root = require('./constants/root')\\nconst mergeOptions = require('merge-options')\\nconst tryWebExt = require('./providers/webext')\\nconst tryWindow = require('./providers/window-ipfs')\\nconst tryHttpClient = require('./providers/http-client')\\nconst tryJsIpfs = require('./providers/js-ipfs')\\n\\nconst defaultGlobalOpts = {\\n connectionTest: async (ipfs) => {\\n // ipfs connection is working if we can fetch data via async iterator API\\n const cid = 'QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn'\\n for await (const file of ipfs.get(cid)) {\\n return file.type === 'dir' && file.name === cid\\n }\\n }\\n}\\n\\nconst makeProvider = (fn, defaults = {}) => {\\n return (options = {}) => {\\n return (globalOpts) => {\\n options = mergeOptions(defaultGlobalOpts, defaults, globalOpts, options)\\n return fn(options)\\n }\\n }\\n}\\n\\nconst providers = {\\n httpClient: makeProvider((options) => {\\n return tryHttpClient({ root, ...options })\\n }),\\n windowIpfs: makeProvider(options => {\\n return tryWindow({ root, ...options })\\n }),\\n jsIpfs: makeProvider(options => {\\n return tryJsIpfs(options)\\n }),\\n webExt: makeProvider(options => {\\n return tryWebExt({ root, ...options })\\n })\\n}\\n\\nconst defaultProviders = [\\n providers.windowIpfs(),\\n providers.httpClient()\\n]\\n\\nasync function getIpfs ({ providers = defaultProviders, ...options } = {}) {\\n for (const provider of providers) {\\n try {\\n const res = await provider(options)\\n if (res) return res\\n } catch (err) {\\n // provider failed unexpectedly, log error and move to the next one\\n console.error('[ipfs-provider]', err) // eslint-disable-line no-console\\n }\\n }\\n}\\n\\nmodule.exports = {\\n getIpfs,\\n providers,\\n makeProvider\\n}\\n\\n},{\\\"./constants/root\\\":37,\\\"./providers/http-client\\\":39,\\\"./providers/js-ipfs\\\":40,\\\"./providers/webext\\\":41,\\\"./providers/window-ipfs\\\":42,\\\"merge-options\\\":47}],39:[function(require,module,exports){\\n'use strict'\\n\\nconst { URL } = require('iso-url')\\nconst PROVIDERS = require('../constants/providers')\\nconst { DEFAULT_HTTP_API } = require('../constants/defaults')\\n\\n/*\\n * This provider lazy-loads https://github.com/ipfs/js-ipfs-http-client\\n * so it is not included as a dependency if not used.\\n *\\n * HTTP Client init fallback:\\n * 1. Use constructor returned by loadHttpClientModule function\\n * 2. Fallback to window.IpfsHttpClient\\n *\\n * API URL fallback order:\\n * 1. Try user specified API address\\n * 2. Try current origin\\n * 3. Try DEFAULT_HTTP_API\\n*/\\nasync function tryHttpClient ({ loadHttpClientModule, apiAddress, root, connectionTest }) {\\n // Find HTTP client\\n let httpClient\\n if (loadHttpClientModule) httpClient = await loadHttpClientModule()\\n\\n // Final fallback to window.IpfsHttpClient or error\\n if (!httpClient) {\\n if (root.IpfsHttpClient) {\\n httpClient = root.IpfsHttpClient\\n } else {\\n throw new Error('ipfs-provider could not initialize js-ipfs-http-client: make sure its constructor is returned by loadHttpClientModule function or exposed at window.IpfsHttpClient')\\n }\\n }\\n\\n // Allow the use of `import` or `require` on `loadHttpClientModule` fn\\n httpClient = httpClient.default || httpClient // TODO: create 'import' demo in examples/\\n\\n // Explicit custom apiAddress provided. Only try that.\\n if (apiAddress) {\\n return maybeApi({ apiAddress, connectionTest, httpClient })\\n }\\n\\n // Current origin is not localhost:5001 so try with current origin info\\n const { location } = root\\n if (location && !(location.port === '5001' && location.hostname.match(/^127.0.0.1$|^localhost$/))) {\\n const origin = new URL(location.origin)\\n origin.pathname = '/'\\n const res = await maybeApi({\\n apiAddress: origin.toString(),\\n connectionTest,\\n httpClient\\n })\\n if (res) return res\\n }\\n\\n // ...otherwise try /ip4/127.0.0.1/tcp/5001\\n return maybeApi({ apiAddress: DEFAULT_HTTP_API, connectionTest, httpClient })\\n}\\n\\n// Init and test an api client against provded API address.\\n// Returns js-ipfs-http-client instance or null\\nasync function maybeApi ({ apiAddress, connectionTest, httpClient }) {\\n try {\\n const ipfs = httpClient(apiAddress)\\n await connectionTest(ipfs)\\n return { ipfs, provider: PROVIDERS.httpClient, apiAddress }\\n } catch (error) {\\n // Failed to connect to ipfs-api in `apiAddress`\\n // console.error('[ipfs-provider:httpClient]', error)\\n return null\\n }\\n}\\n\\nmodule.exports = tryHttpClient\\n\\n},{\\\"../constants/defaults\\\":35,\\\"../constants/providers\\\":36,\\\"iso-url\\\":44}],40:[function(require,module,exports){\\n'use strict'\\n\\nconst PROVIDERS = require('../constants/providers')\\n\\nfunction createIpfs (ipfsModule, opts) {\\n // Allow the use of `import` or `require` on `getJsIpfs` fn\\n ipfsModule = ipfsModule.default || ipfsModule\\n return ipfsModule.create(opts)\\n}\\n\\nasync function tryJsIpfs ({ connectionTest, loadJsIpfsModule, options, init = createIpfs }) {\\n const ipfsModule = await loadJsIpfsModule()\\n const ipfs = await init(ipfsModule, options)\\n await connectionTest(ipfs)\\n return { ipfs, provider: PROVIDERS.jsIpfs }\\n}\\n\\nmodule.exports = tryJsIpfs\\n\\n},{\\\"../constants/providers\\\":36}],41:[function(require,module,exports){\\n'use strict'\\n\\nconst PROVIDERS = require('../constants/providers')\\n\\nasync function tryWebExt ({ root, connectionTest }) {\\n // Opportunistic optimizations when running inside of web extension (eg. ipfs-companion)\\n if (typeof root.chrome === 'object' && root.chrome.extension && root.chrome.extension.getBackgroundPage) {\\n // Note: under some vendors getBackgroundPage() will return null if window is in incognito mode\\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1329304\\n let bg = null\\n try {\\n bg = root.chrome.extension.getBackgroundPage()\\n } catch (err) {\\n // not in browser extension\\n return null\\n }\\n // If extension is exposing IPFS API as `ipfs` on the background page\\n // it can be used directly for the best performance\\n if (bg && bg.ipfs) {\\n const { ipfs } = bg\\n await connectionTest(ipfs)\\n return { ipfs, provider: PROVIDERS.webExt }\\n }\\n /* Other endpoints can be added here in the future.\\n For example, Companion could provide API for other browser extensions:\\n https://github.com/ipfs-shipyard/ipfs-companion/issues/307 */\\n }\\n}\\n\\nmodule.exports = tryWebExt\\n\\n},{\\\"../constants/providers\\\":36}],42:[function(require,module,exports){\\n'use strict'\\n\\nconst PROVIDERS = require('../constants/providers')\\n\\nasync function tryWindow ({ root, permissions, connectionTest }) {\\n if (root.ipfs) {\\n // files.get is required for testing if API works, ensure we request it\\n if (!(permissions && permissions.commands && permissions.commands.includes('files.get'))) {\\n permissions = permissions || {}\\n permissions = JSON.parse(JSON.stringify(permissions)) // deep copy to work with freezed objects\\n permissions.commands = permissions.commands || []\\n permissions.commands.push('files.get')\\n }\\n // try window.ipfs.enable first: https://github.com/ipfs-shipyard/ipfs-companion/issues/589\\n const ipfs = typeof root.ipfs.enable === 'function'\\n ? await root.ipfs.enable(permissions)\\n : root.ipfs\\n await connectionTest(ipfs)\\n return { ipfs, provider: PROVIDERS.windowIpfs }\\n }\\n}\\n\\nmodule.exports = tryWindow\\n\\n},{\\\"../constants/providers\\\":36}],43:[function(require,module,exports){\\n'use strict';\\n\\nmodule.exports = value => {\\n\\tif (Object.prototype.toString.call(value) !== '[object Object]') {\\n\\t\\treturn false;\\n\\t}\\n\\n\\tconst prototype = Object.getPrototypeOf(value);\\n\\treturn prototype === null || prototype === Object.prototype;\\n};\\n\\n},{}],44:[function(require,module,exports){\\n'use strict';\\n\\nconst {\\n URLWithLegacySupport,\\n format,\\n URLSearchParams,\\n defaultBase\\n} = require('./src/url');\\nconst relative = require('./src/relative');\\n\\nmodule.exports = {\\n URL: URLWithLegacySupport,\\n URLSearchParams,\\n format,\\n relative,\\n defaultBase\\n};\\n\\n},{\\\"./src/relative\\\":45,\\\"./src/url\\\":46}],45:[function(require,module,exports){\\n'use strict';\\n\\nconst { URLWithLegacySupport, format } = require('./url');\\n\\nmodule.exports = (url, location = {}, protocolMap = {}, defaultProtocol) => {\\n let protocol = location.protocol ?\\n location.protocol.replace(':', '') :\\n 'http';\\n\\n // Check protocol map\\n protocol = (protocolMap[protocol] || defaultProtocol || protocol) + ':';\\n let urlParsed;\\n\\n try {\\n urlParsed = new URLWithLegacySupport(url);\\n } catch (err) {\\n urlParsed = {};\\n }\\n\\n const base = Object.assign({}, location, {\\n protocol: protocol || urlParsed.protocol,\\n host: location.host || urlParsed.host\\n });\\n\\n return new URLWithLegacySupport(url, format(base)).toString();\\n};\\n\\n},{\\\"./url\\\":46}],46:[function(require,module,exports){\\n'use strict';\\n\\nconst defaultBase = self.location ?\\n self.location.protocol + '//' + self.location.host :\\n '';\\nconst URL = self.URL;\\n\\nclass URLWithLegacySupport {\\n constructor(url = '', base = defaultBase) {\\n this.super = new URL(url, base);\\n this.path = this.pathname + this.search;\\n this.auth =\\n this.username && this.password ?\\n this.username + ':' + this.password :\\n null;\\n\\n this.query =\\n this.search && this.search.startsWith('?') ?\\n this.search.slice(1) :\\n null;\\n }\\n\\n get hash() {\\n return this.super.hash;\\n }\\n get host() {\\n return this.super.host;\\n }\\n get hostname() {\\n return this.super.hostname;\\n }\\n get href() {\\n return this.super.href;\\n }\\n get origin() {\\n return this.super.origin;\\n }\\n get password() {\\n return this.super.password;\\n }\\n get pathname() {\\n return this.super.pathname;\\n }\\n get port() {\\n return this.super.port;\\n }\\n get protocol() {\\n return this.super.protocol;\\n }\\n get search() {\\n return this.super.search;\\n }\\n get searchParams() {\\n return this.super.searchParams;\\n }\\n get username() {\\n return this.super.username;\\n }\\n\\n set hash(hash) {\\n this.super.hash = hash;\\n }\\n set host(host) {\\n this.super.host = host;\\n }\\n set hostname(hostname) {\\n this.super.hostname = hostname;\\n }\\n set href(href) {\\n this.super.href = href;\\n }\\n set origin(origin) {\\n this.super.origin = origin;\\n }\\n set password(password) {\\n this.super.password = password;\\n }\\n set pathname(pathname) {\\n this.super.pathname = pathname;\\n }\\n set port(port) {\\n this.super.port = port;\\n }\\n set protocol(protocol) {\\n this.super.protocol = protocol;\\n }\\n set search(search) {\\n this.super.search = search;\\n }\\n set searchParams(searchParams) {\\n this.super.searchParams = searchParams;\\n }\\n set username(username) {\\n this.super.username = username;\\n }\\n\\n createObjectURL(o) {\\n return this.super.createObjectURL(o);\\n }\\n revokeObjectURL(o) {\\n this.super.revokeObjectURL(o);\\n }\\n toJSON() {\\n return this.super.toJSON();\\n }\\n toString() {\\n return this.super.toString();\\n }\\n format() {\\n return this.toString();\\n }\\n}\\n\\nfunction format(obj) {\\n if (typeof obj === 'string') {\\n const url = new URL(obj);\\n\\n return url.toString();\\n }\\n\\n if (!(obj instanceof URL)) {\\n const userPass =\\n obj.username && obj.password ?\\n `${obj.username}:${obj.password}@` :\\n '';\\n const auth = obj.auth ? obj.auth + '@' : '';\\n const port = obj.port ? ':' + obj.port : '';\\n const protocol = obj.protocol ? obj.protocol + '//' : '';\\n const host = obj.host || '';\\n const hostname = obj.hostname || '';\\n const search = obj.search || (obj.query ? '?' + obj.query : '');\\n const hash = obj.hash || '';\\n const pathname = obj.pathname || '';\\n const path = obj.path || pathname + search;\\n\\n return `${protocol}${userPass || auth}${host ||\\n hostname + port}${path}${hash}`;\\n }\\n}\\n\\nmodule.exports = {\\n URLWithLegacySupport,\\n URLSearchParams: self.URLSearchParams,\\n defaultBase,\\n format\\n};\\n\\n},{}],47:[function(require,module,exports){\\n'use strict';\\nconst isOptionObject = require('is-plain-obj');\\n\\nconst {hasOwnProperty} = Object.prototype;\\nconst {propertyIsEnumerable} = Object;\\nconst defineProperty = (obj, name, value) => Object.defineProperty(obj, name, {\\n\\tvalue,\\n\\twritable: true,\\n\\tenumerable: true,\\n\\tconfigurable: true\\n});\\n\\nconst globalThis = this;\\nconst defaultMergeOpts = {\\n\\tconcatArrays: false,\\n\\tignoreUndefined: false\\n};\\n\\nconst getEnumerableOwnPropertyKeys = value => {\\n\\tconst keys = [];\\n\\n\\tfor (const key in value) {\\n\\t\\tif (hasOwnProperty.call(value, key)) {\\n\\t\\t\\tkeys.push(key);\\n\\t\\t}\\n\\t}\\n\\n\\t/* istanbul ignore else */\\n\\tif (Object.getOwnPropertySymbols) {\\n\\t\\tconst symbols = Object.getOwnPropertySymbols(value);\\n\\n\\t\\tfor (const symbol of symbols) {\\n\\t\\t\\tif (propertyIsEnumerable.call(value, symbol)) {\\n\\t\\t\\t\\tkeys.push(symbol);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn keys;\\n};\\n\\nfunction clone(value) {\\n\\tif (Array.isArray(value)) {\\n\\t\\treturn cloneArray(value);\\n\\t}\\n\\n\\tif (isOptionObject(value)) {\\n\\t\\treturn cloneOptionObject(value);\\n\\t}\\n\\n\\treturn value;\\n}\\n\\nfunction cloneArray(array) {\\n\\tconst result = array.slice(0, 0);\\n\\n\\tgetEnumerableOwnPropertyKeys(array).forEach(key => {\\n\\t\\tdefineProperty(result, key, clone(array[key]));\\n\\t});\\n\\n\\treturn result;\\n}\\n\\nfunction cloneOptionObject(obj) {\\n\\tconst result = Object.getPrototypeOf(obj) === null ? Object.create(null) : {};\\n\\n\\tgetEnumerableOwnPropertyKeys(obj).forEach(key => {\\n\\t\\tdefineProperty(result, key, clone(obj[key]));\\n\\t});\\n\\n\\treturn result;\\n}\\n\\n/**\\n * @param {*} merged already cloned\\n * @param {*} source something to merge\\n * @param {string[]} keys keys to merge\\n * @param {Object} config Config Object\\n * @returns {*} cloned Object\\n */\\nconst mergeKeys = (merged, source, keys, config) => {\\n\\tkeys.forEach(key => {\\n\\t\\tif (typeof source[key] === 'undefined' && config.ignoreUndefined) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Do not recurse into prototype chain of merged\\n\\t\\tif (key in merged && merged[key] !== Object.getPrototypeOf(merged)) {\\n\\t\\t\\tdefineProperty(merged, key, merge(merged[key], source[key], config));\\n\\t\\t} else {\\n\\t\\t\\tdefineProperty(merged, key, clone(source[key]));\\n\\t\\t}\\n\\t});\\n\\n\\treturn merged;\\n};\\n\\n/**\\n * @param {*} merged already cloned\\n * @param {*} source something to merge\\n * @param {Object} config Config Object\\n * @returns {*} cloned Object\\n *\\n * see [Array.prototype.concat ( ...arguments )](http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.concat)\\n */\\nconst concatArrays = (merged, source, config) => {\\n\\tlet result = merged.slice(0, 0);\\n\\tlet resultIndex = 0;\\n\\n\\t[merged, source].forEach(array => {\\n\\t\\tconst indices = [];\\n\\n\\t\\t// `result.concat(array)` with cloning\\n\\t\\tfor (let k = 0; k \u003C array.length; k++) {\\n\\t\\t\\tif (!hasOwnProperty.call(array, k)) {\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\tindices.push(String(k));\\n\\n\\t\\t\\tif (array === merged) {\\n\\t\\t\\t\\t// Already cloned\\n\\t\\t\\t\\tdefineProperty(result, resultIndex++, array[k]);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdefineProperty(result, resultIndex++, clone(array[k]));\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Merge non-index keys\\n\\t\\tresult = mergeKeys(result, array, getEnumerableOwnPropertyKeys(array).filter(key => !indices.includes(key)), config);\\n\\t});\\n\\n\\treturn result;\\n};\\n\\n/**\\n * @param {*} merged already cloned\\n * @param {*} source something to merge\\n * @param {Object} config Config Object\\n * @returns {*} cloned Object\\n */\\nfunction merge(merged, source, config) {\\n\\tif (config.concatArrays && Array.isArray(merged) && Array.isArray(source)) {\\n\\t\\treturn concatArrays(merged, source, config);\\n\\t}\\n\\n\\tif (!isOptionObject(source) || !isOptionObject(merged)) {\\n\\t\\treturn clone(source);\\n\\t}\\n\\n\\treturn mergeKeys(merged, source, getEnumerableOwnPropertyKeys(source), config);\\n}\\n\\nmodule.exports = function (...options) {\\n\\tconst config = merge(clone(defaultMergeOpts), (this !== globalThis && this) || {}, defaultMergeOpts);\\n\\tlet merged = {_: {}};\\n\\n\\tfor (const option of options) {\\n\\t\\tif (option === undefined) {\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\n\\t\\tif (!isOptionObject(option)) {\\n\\t\\t\\tthrow new TypeError('`' + option + '` is not an Option Object');\\n\\t\\t}\\n\\n\\t\\tmerged = merge(merged, {_: option}, config);\\n\\t}\\n\\n\\treturn merged._;\\n};\\n\\n},{\\\"is-plain-obj\\\":43}],48:[function(require,module,exports){\\narguments[4][18][0].apply(exports,arguments)\\n},{\\\"dup\\\":18}],49:[function(require,module,exports){\\narguments[4][19][0].apply(exports,arguments)\\n},{\\\"buffer\\\":5,\\\"dup\\\":19}],50:[function(require,module,exports){\\narguments[4][20][0].apply(exports,arguments)\\n},{\\\"dup\\\":20}],51:[function(require,module,exports){\\narguments[4][21][0].apply(exports,arguments)\\n},{\\\"buffer\\\":5,\\\"dup\\\":21}],52:[function(require,module,exports){\\narguments[4][22][0].apply(exports,arguments)\\n},{\\\"./base.js\\\":48,\\\"./base16\\\":49,\\\"./base32\\\":50,\\\"./base64\\\":51,\\\"base-x\\\":3,\\\"dup\\\":22}],53:[function(require,module,exports){\\n/**\\n * Implementation of the [multibase](https://github.com/multiformats/multibase) specification.\\n * @module Multibase\\n */\\n'use strict'\\n\\nconst { Buffer } = require('buffer')\\nconst constants = require('./constants')\\n\\nexports = module.exports = multibase\\nexports.encode = encode\\nexports.decode = decode\\nexports.isEncoded = isEncoded\\nexports.names = Object.freeze(Object.keys(constants.names))\\nexports.codes = Object.freeze(Object.keys(constants.codes))\\n\\n/**\\n * Create a new buffer with the multibase varint+code.\\n *\\n * @param {string|number} nameOrCode - The multibase name or code number.\\n * @param {Buffer} buf - The data to be prefixed with multibase.\\n * @memberof Multibase\\n * @returns {Buffer}\\n */\\nfunction multibase (nameOrCode, buf) {\\n if (!buf) {\\n throw new Error('requires an encoded buffer')\\n }\\n const base = getBase(nameOrCode)\\n const codeBuf = Buffer.from(base.code)\\n\\n const name = base.name\\n validEncode(name, buf)\\n return Buffer.concat([codeBuf, buf])\\n}\\n\\n/**\\n * Encode data with the specified base and add the multibase prefix.\\n *\\n * @param {string|number} nameOrCode - The multibase name or code number.\\n * @param {Buffer} buf - The data to be encoded.\\n * @returns {Buffer}\\n * @memberof Multibase\\n */\\nfunction encode (nameOrCode, buf) {\\n const base = getBase(nameOrCode)\\n const name = base.name\\n\\n return multibase(name, Buffer.from(base.encode(buf)))\\n}\\n\\n/**\\n * Takes a buffer or string encoded with multibase header, decodes it and\\n * returns the decoded buffer\\n *\\n * @param {Buffer|string} bufOrString\\n * @returns {Buffer}\\n * @memberof Multibase\\n *\\n */\\nfunction decode (bufOrString) {\\n if (Buffer.isBuffer(bufOrString)) {\\n bufOrString = bufOrString.toString()\\n }\\n\\n const code = bufOrString.substring(0, 1)\\n bufOrString = bufOrString.substring(1, bufOrString.length)\\n\\n if (typeof bufOrString === 'string') {\\n bufOrString = Buffer.from(bufOrString)\\n }\\n\\n const base = getBase(code)\\n return Buffer.from(base.decode(bufOrString.toString()))\\n}\\n\\n/**\\n * Is the given data multibase encoded?\\n *\\n * @param {Buffer|string} bufOrString\\n * @returns {boolean}\\n * @memberof Multibase\\n */\\nfunction isEncoded (bufOrString) {\\n if (Buffer.isBuffer(bufOrString)) {\\n bufOrString = bufOrString.toString()\\n }\\n\\n // Ensure bufOrString is a string\\n if (Object.prototype.toString.call(bufOrString) !== '[object String]') {\\n return false\\n }\\n\\n const code = bufOrString.substring(0, 1)\\n try {\\n const base = getBase(code)\\n return base.name\\n } catch (err) {\\n return false\\n }\\n}\\n\\n/**\\n * @param {string} name\\n * @param {Buffer} buf\\n * @private\\n * @returns {undefined}\\n */\\nfunction validEncode (name, buf) {\\n const base = getBase(name)\\n base.decode(buf.toString())\\n}\\n\\nfunction getBase (nameOrCode) {\\n let base\\n\\n if (constants.names[nameOrCode]) {\\n base = constants.names[nameOrCode]\\n } else if (constants.codes[nameOrCode]) {\\n base = constants.codes[nameOrCode]\\n } else {\\n throw new Error('Unsupported encoding')\\n }\\n\\n if (!base.isImplemented()) {\\n throw new Error('Base ' + nameOrCode + ' is not implemented yet')\\n }\\n\\n return base\\n}\\n\\n},{\\\"./constants\\\":52,\\\"buffer\\\":5}],54:[function(require,module,exports){\\narguments[4][9][0].apply(exports,arguments)\\n},{\\\"dup\\\":9}],55:[function(require,module,exports){\\narguments[4][10][0].apply(exports,arguments)\\n},{\\\"./base-table.json\\\":54,\\\"dup\\\":10}],56:[function(require,module,exports){\\narguments[4][11][0].apply(exports,arguments)\\n},{\\\"./constants\\\":55,\\\"./int-table\\\":57,\\\"./print\\\":58,\\\"./util\\\":59,\\\"./varint-table\\\":60,\\\"buffer\\\":5,\\\"dup\\\":11,\\\"varint\\\":67}],57:[function(require,module,exports){\\narguments[4][12][0].apply(exports,arguments)\\n},{\\\"./base-table.json\\\":54,\\\"dup\\\":12}],58:[function(require,module,exports){\\narguments[4][13][0].apply(exports,arguments)\\n},{\\\"./base-table.json\\\":54,\\\"dup\\\":13}],59:[function(require,module,exports){\\narguments[4][14][0].apply(exports,arguments)\\n},{\\\"buffer\\\":5,\\\"dup\\\":14,\\\"varint\\\":67}],60:[function(require,module,exports){\\narguments[4][15][0].apply(exports,arguments)\\n},{\\\"./base-table.json\\\":54,\\\"./util\\\":59,\\\"dup\\\":15}],61:[function(require,module,exports){\\n/* eslint quote-props: off */\\n/* eslint key-spacing: off */\\n'use strict'\\n\\nexports.names = Object.freeze({\\n 'identity': 0x0,\\n 'sha1': 0x11,\\n 'sha2-256': 0x12,\\n 'sha2-512': 0x13,\\n 'dbl-sha2-256': 0x56,\\n 'sha3-224': 0x17,\\n 'sha3-256': 0x16,\\n 'sha3-384': 0x15,\\n 'sha3-512': 0x14,\\n 'shake-128': 0x18,\\n 'shake-256': 0x19,\\n 'keccak-224': 0x1A,\\n 'keccak-256': 0x1B,\\n 'keccak-384': 0x1C,\\n 'keccak-512': 0x1D,\\n 'murmur3-128': 0x22,\\n 'murmur3-32': 0x23,\\n 'md4': 0xd4,\\n 'md5': 0xd5,\\n 'blake2b-8': 0xb201,\\n 'blake2b-16': 0xb202,\\n 'blake2b-24': 0xb203,\\n 'blake2b-32': 0xb204,\\n 'blake2b-40': 0xb205,\\n 'blake2b-48': 0xb206,\\n 'blake2b-56': 0xb207,\\n 'blake2b-64': 0xb208,\\n 'blake2b-72': 0xb209,\\n 'blake2b-80': 0xb20a,\\n 'blake2b-88': 0xb20b,\\n 'blake2b-96': 0xb20c,\\n 'blake2b-104': 0xb20d,\\n 'blake2b-112': 0xb20e,\\n 'blake2b-120': 0xb20f,\\n 'blake2b-128': 0xb210,\\n 'blake2b-136': 0xb211,\\n 'blake2b-144': 0xb212,\\n 'blake2b-152': 0xb213,\\n 'blake2b-160': 0xb214,\\n 'blake2b-168': 0xb215,\\n 'blake2b-176': 0xb216,\\n 'blake2b-184': 0xb217,\\n 'blake2b-192': 0xb218,\\n 'blake2b-200': 0xb219,\\n 'blake2b-208': 0xb21a,\\n 'blake2b-216': 0xb21b,\\n 'blake2b-224': 0xb21c,\\n 'blake2b-232': 0xb21d,\\n 'blake2b-240': 0xb21e,\\n 'blake2b-248': 0xb21f,\\n 'blake2b-256': 0xb220,\\n 'blake2b-264': 0xb221,\\n 'blake2b-272': 0xb222,\\n 'blake2b-280': 0xb223,\\n 'blake2b-288': 0xb224,\\n 'blake2b-296': 0xb225,\\n 'blake2b-304': 0xb226,\\n 'blake2b-312': 0xb227,\\n 'blake2b-320': 0xb228,\\n 'blake2b-328': 0xb229,\\n 'blake2b-336': 0xb22a,\\n 'blake2b-344': 0xb22b,\\n 'blake2b-352': 0xb22c,\\n 'blake2b-360': 0xb22d,\\n 'blake2b-368': 0xb22e,\\n 'blake2b-376': 0xb22f,\\n 'blake2b-384': 0xb230,\\n 'blake2b-392': 0xb231,\\n 'blake2b-400': 0xb232,\\n 'blake2b-408': 0xb233,\\n 'blake2b-416': 0xb234,\\n 'blake2b-424': 0xb235,\\n 'blake2b-432': 0xb236,\\n 'blake2b-440': 0xb237,\\n 'blake2b-448': 0xb238,\\n 'blake2b-456': 0xb239,\\n 'blake2b-464': 0xb23a,\\n 'blake2b-472': 0xb23b,\\n 'blake2b-480': 0xb23c,\\n 'blake2b-488': 0xb23d,\\n 'blake2b-496': 0xb23e,\\n 'blake2b-504': 0xb23f,\\n 'blake2b-512': 0xb240,\\n 'blake2s-8': 0xb241,\\n 'blake2s-16': 0xb242,\\n 'blake2s-24': 0xb243,\\n 'blake2s-32': 0xb244,\\n 'blake2s-40': 0xb245,\\n 'blake2s-48': 0xb246,\\n 'blake2s-56': 0xb247,\\n 'blake2s-64': 0xb248,\\n 'blake2s-72': 0xb249,\\n 'blake2s-80': 0xb24a,\\n 'blake2s-88': 0xb24b,\\n 'blake2s-96': 0xb24c,\\n 'blake2s-104': 0xb24d,\\n 'blake2s-112': 0xb24e,\\n 'blake2s-120': 0xb24f,\\n 'blake2s-128': 0xb250,\\n 'blake2s-136': 0xb251,\\n 'blake2s-144': 0xb252,\\n 'blake2s-152': 0xb253,\\n 'blake2s-160': 0xb254,\\n 'blake2s-168': 0xb255,\\n 'blake2s-176': 0xb256,\\n 'blake2s-184': 0xb257,\\n 'blake2s-192': 0xb258,\\n 'blake2s-200': 0xb259,\\n 'blake2s-208': 0xb25a,\\n 'blake2s-216': 0xb25b,\\n 'blake2s-224': 0xb25c,\\n 'blake2s-232': 0xb25d,\\n 'blake2s-240': 0xb25e,\\n 'blake2s-248': 0xb25f,\\n 'blake2s-256': 0xb260,\\n 'Skein256-8': 0xb301,\\n 'Skein256-16': 0xb302,\\n 'Skein256-24': 0xb303,\\n 'Skein256-32': 0xb304,\\n 'Skein256-40': 0xb305,\\n 'Skein256-48': 0xb306,\\n 'Skein256-56': 0xb307,\\n 'Skein256-64': 0xb308,\\n 'Skein256-72': 0xb309,\\n 'Skein256-80': 0xb30a,\\n 'Skein256-88': 0xb30b,\\n 'Skein256-96': 0xb30c,\\n 'Skein256-104': 0xb30d,\\n 'Skein256-112': 0xb30e,\\n 'Skein256-120': 0xb30f,\\n 'Skein256-128': 0xb310,\\n 'Skein256-136': 0xb311,\\n 'Skein256-144': 0xb312,\\n 'Skein256-152': 0xb313,\\n 'Skein256-160': 0xb314,\\n 'Skein256-168': 0xb315,\\n 'Skein256-176': 0xb316,\\n 'Skein256-184': 0xb317,\\n 'Skein256-192': 0xb318,\\n 'Skein256-200': 0xb319,\\n 'Skein256-208': 0xb31a,\\n 'Skein256-216': 0xb31b,\\n 'Skein256-224': 0xb31c,\\n 'Skein256-232': 0xb31d,\\n 'Skein256-240': 0xb31e,\\n 'Skein256-248': 0xb31f,\\n 'Skein256-256': 0xb320,\\n 'Skein512-8': 0xb321,\\n 'Skein512-16': 0xb322,\\n 'Skein512-24': 0xb323,\\n 'Skein512-32': 0xb324,\\n 'Skein512-40': 0xb325,\\n 'Skein512-48': 0xb326,\\n 'Skein512-56': 0xb327,\\n 'Skein512-64': 0xb328,\\n 'Skein512-72': 0xb329,\\n 'Skein512-80': 0xb32a,\\n 'Skein512-88': 0xb32b,\\n 'Skein512-96': 0xb32c,\\n 'Skein512-104': 0xb32d,\\n 'Skein512-112': 0xb32e,\\n 'Skein512-120': 0xb32f,\\n 'Skein512-128': 0xb330,\\n 'Skein512-136': 0xb331,\\n 'Skein512-144': 0xb332,\\n 'Skein512-152': 0xb333,\\n 'Skein512-160': 0xb334,\\n 'Skein512-168': 0xb335,\\n 'Skein512-176': 0xb336,\\n 'Skein512-184': 0xb337,\\n 'Skein512-192': 0xb338,\\n 'Skein512-200': 0xb339,\\n 'Skein512-208': 0xb33a,\\n 'Skein512-216': 0xb33b,\\n 'Skein512-224': 0xb33c,\\n 'Skein512-232': 0xb33d,\\n 'Skein512-240': 0xb33e,\\n 'Skein512-248': 0xb33f,\\n 'Skein512-256': 0xb340,\\n 'Skein512-264': 0xb341,\\n 'Skein512-272': 0xb342,\\n 'Skein512-280': 0xb343,\\n 'Skein512-288': 0xb344,\\n 'Skein512-296': 0xb345,\\n 'Skein512-304': 0xb346,\\n 'Skein512-312': 0xb347,\\n 'Skein512-320': 0xb348,\\n 'Skein512-328': 0xb349,\\n 'Skein512-336': 0xb34a,\\n 'Skein512-344': 0xb34b,\\n 'Skein512-352': 0xb34c,\\n 'Skein512-360': 0xb34d,\\n 'Skein512-368': 0xb34e,\\n 'Skein512-376': 0xb34f,\\n 'Skein512-384': 0xb350,\\n 'Skein512-392': 0xb351,\\n 'Skein512-400': 0xb352,\\n 'Skein512-408': 0xb353,\\n 'Skein512-416': 0xb354,\\n 'Skein512-424': 0xb355,\\n 'Skein512-432': 0xb356,\\n 'Skein512-440': 0xb357,\\n 'Skein512-448': 0xb358,\\n 'Skein512-456': 0xb359,\\n 'Skein512-464': 0xb35a,\\n 'Skein512-472': 0xb35b,\\n 'Skein512-480': 0xb35c,\\n 'Skein512-488': 0xb35d,\\n 'Skein512-496': 0xb35e,\\n 'Skein512-504': 0xb35f,\\n 'Skein512-512': 0xb360,\\n 'Skein1024-8': 0xb361,\\n 'Skein1024-16': 0xb362,\\n 'Skein1024-24': 0xb363,\\n 'Skein1024-32': 0xb364,\\n 'Skein1024-40': 0xb365,\\n 'Skein1024-48': 0xb366,\\n 'Skein1024-56': 0xb367,\\n 'Skein1024-64': 0xb368,\\n 'Skein1024-72': 0xb369,\\n 'Skein1024-80': 0xb36a,\\n 'Skein1024-88': 0xb36b,\\n 'Skein1024-96': 0xb36c,\\n 'Skein1024-104': 0xb36d,\\n 'Skein1024-112': 0xb36e,\\n 'Skein1024-120': 0xb36f,\\n 'Skein1024-128': 0xb370,\\n 'Skein1024-136': 0xb371,\\n 'Skein1024-144': 0xb372,\\n 'Skein1024-152': 0xb373,\\n 'Skein1024-160': 0xb374,\\n 'Skein1024-168': 0xb375,\\n 'Skein1024-176': 0xb376,\\n 'Skein1024-184': 0xb377,\\n 'Skein1024-192': 0xb378,\\n 'Skein1024-200': 0xb379,\\n 'Skein1024-208': 0xb37a,\\n 'Skein1024-216': 0xb37b,\\n 'Skein1024-224': 0xb37c,\\n 'Skein1024-232': 0xb37d,\\n 'Skein1024-240': 0xb37e,\\n 'Skein1024-248': 0xb37f,\\n 'Skein1024-256': 0xb380,\\n 'Skein1024-264': 0xb381,\\n 'Skein1024-272': 0xb382,\\n 'Skein1024-280': 0xb383,\\n 'Skein1024-288': 0xb384,\\n 'Skein1024-296': 0xb385,\\n 'Skein1024-304': 0xb386,\\n 'Skein1024-312': 0xb387,\\n 'Skein1024-320': 0xb388,\\n 'Skein1024-328': 0xb389,\\n 'Skein1024-336': 0xb38a,\\n 'Skein1024-344': 0xb38b,\\n 'Skein1024-352': 0xb38c,\\n 'Skein1024-360': 0xb38d,\\n 'Skein1024-368': 0xb38e,\\n 'Skein1024-376': 0xb38f,\\n 'Skein1024-384': 0xb390,\\n 'Skein1024-392': 0xb391,\\n 'Skein1024-400': 0xb392,\\n 'Skein1024-408': 0xb393,\\n 'Skein1024-416': 0xb394,\\n 'Skein1024-424': 0xb395,\\n 'Skein1024-432': 0xb396,\\n 'Skein1024-440': 0xb397,\\n 'Skein1024-448': 0xb398,\\n 'Skein1024-456': 0xb399,\\n 'Skein1024-464': 0xb39a,\\n 'Skein1024-472': 0xb39b,\\n 'Skein1024-480': 0xb39c,\\n 'Skein1024-488': 0xb39d,\\n 'Skein1024-496': 0xb39e,\\n 'Skein1024-504': 0xb39f,\\n 'Skein1024-512': 0xb3a0,\\n 'Skein1024-520': 0xb3a1,\\n 'Skein1024-528': 0xb3a2,\\n 'Skein1024-536': 0xb3a3,\\n 'Skein1024-544': 0xb3a4,\\n 'Skein1024-552': 0xb3a5,\\n 'Skein1024-560': 0xb3a6,\\n 'Skein1024-568': 0xb3a7,\\n 'Skein1024-576': 0xb3a8,\\n 'Skein1024-584': 0xb3a9,\\n 'Skein1024-592': 0xb3aa,\\n 'Skein1024-600': 0xb3ab,\\n 'Skein1024-608': 0xb3ac,\\n 'Skein1024-616': 0xb3ad,\\n 'Skein1024-624': 0xb3ae,\\n 'Skein1024-632': 0xb3af,\\n 'Skein1024-640': 0xb3b0,\\n 'Skein1024-648': 0xb3b1,\\n 'Skein1024-656': 0xb3b2,\\n 'Skein1024-664': 0xb3b3,\\n 'Skein1024-672': 0xb3b4,\\n 'Skein1024-680': 0xb3b5,\\n 'Skein1024-688': 0xb3b6,\\n 'Skein1024-696': 0xb3b7,\\n 'Skein1024-704': 0xb3b8,\\n 'Skein1024-712': 0xb3b9,\\n 'Skein1024-720': 0xb3ba,\\n 'Skein1024-728': 0xb3bb,\\n 'Skein1024-736': 0xb3bc,\\n 'Skein1024-744': 0xb3bd,\\n 'Skein1024-752': 0xb3be,\\n 'Skein1024-760': 0xb3bf,\\n 'Skein1024-768': 0xb3c0,\\n 'Skein1024-776': 0xb3c1,\\n 'Skein1024-784': 0xb3c2,\\n 'Skein1024-792': 0xb3c3,\\n 'Skein1024-800': 0xb3c4,\\n 'Skein1024-808': 0xb3c5,\\n 'Skein1024-816': 0xb3c6,\\n 'Skein1024-824': 0xb3c7,\\n 'Skein1024-832': 0xb3c8,\\n 'Skein1024-840': 0xb3c9,\\n 'Skein1024-848': 0xb3ca,\\n 'Skein1024-856': 0xb3cb,\\n 'Skein1024-864': 0xb3cc,\\n 'Skein1024-872': 0xb3cd,\\n 'Skein1024-880': 0xb3ce,\\n 'Skein1024-888': 0xb3cf,\\n 'Skein1024-896': 0xb3d0,\\n 'Skein1024-904': 0xb3d1,\\n 'Skein1024-912': 0xb3d2,\\n 'Skein1024-920': 0xb3d3,\\n 'Skein1024-928': 0xb3d4,\\n 'Skein1024-936': 0xb3d5,\\n 'Skein1024-944': 0xb3d6,\\n 'Skein1024-952': 0xb3d7,\\n 'Skein1024-960': 0xb3d8,\\n 'Skein1024-968': 0xb3d9,\\n 'Skein1024-976': 0xb3da,\\n 'Skein1024-984': 0xb3db,\\n 'Skein1024-992': 0xb3dc,\\n 'Skein1024-1000': 0xb3dd,\\n 'Skein1024-1008': 0xb3de,\\n 'Skein1024-1016': 0xb3df,\\n 'Skein1024-1024': 0xb3e0\\n})\\n\\nexports.codes = Object.freeze({\\n 0x0: 'identity',\\n\\n // sha family\\n 0x11: 'sha1',\\n 0x12: 'sha2-256',\\n 0x13: 'sha2-512',\\n 0x56: 'dbl-sha2-256',\\n 0x17: 'sha3-224',\\n 0x16: 'sha3-256',\\n 0x15: 'sha3-384',\\n 0x14: 'sha3-512',\\n 0x18: 'shake-128',\\n 0x19: 'shake-256',\\n 0x1A: 'keccak-224',\\n 0x1B: 'keccak-256',\\n 0x1C: 'keccak-384',\\n 0x1D: 'keccak-512',\\n\\n 0x22: 'murmur3-128',\\n 0x23: 'murmur3-32',\\n\\n 0xd4: 'md4',\\n 0xd5: 'md5',\\n\\n // blake2\\n 0xb201: 'blake2b-8',\\n 0xb202: 'blake2b-16',\\n 0xb203: 'blake2b-24',\\n 0xb204: 'blake2b-32',\\n 0xb205: 'blake2b-40',\\n 0xb206: 'blake2b-48',\\n 0xb207: 'blake2b-56',\\n 0xb208: 'blake2b-64',\\n 0xb209: 'blake2b-72',\\n 0xb20a: 'blake2b-80',\\n 0xb20b: 'blake2b-88',\\n 0xb20c: 'blake2b-96',\\n 0xb20d: 'blake2b-104',\\n 0xb20e: 'blake2b-112',\\n 0xb20f: 'blake2b-120',\\n 0xb210: 'blake2b-128',\\n 0xb211: 'blake2b-136',\\n 0xb212: 'blake2b-144',\\n 0xb213: 'blake2b-152',\\n 0xb214: 'blake2b-160',\\n 0xb215: 'blake2b-168',\\n 0xb216: 'blake2b-176',\\n 0xb217: 'blake2b-184',\\n 0xb218: 'blake2b-192',\\n 0xb219: 'blake2b-200',\\n 0xb21a: 'blake2b-208',\\n 0xb21b: 'blake2b-216',\\n 0xb21c: 'blake2b-224',\\n 0xb21d: 'blake2b-232',\\n 0xb21e: 'blake2b-240',\\n 0xb21f: 'blake2b-248',\\n 0xb220: 'blake2b-256',\\n 0xb221: 'blake2b-264',\\n 0xb222: 'blake2b-272',\\n 0xb223: 'blake2b-280',\\n 0xb224: 'blake2b-288',\\n 0xb225: 'blake2b-296',\\n 0xb226: 'blake2b-304',\\n 0xb227: 'blake2b-312',\\n 0xb228: 'blake2b-320',\\n 0xb229: 'blake2b-328',\\n 0xb22a: 'blake2b-336',\\n 0xb22b: 'blake2b-344',\\n 0xb22c: 'blake2b-352',\\n 0xb22d: 'blake2b-360',\\n 0xb22e: 'blake2b-368',\\n 0xb22f: 'blake2b-376',\\n 0xb230: 'blake2b-384',\\n 0xb231: 'blake2b-392',\\n 0xb232: 'blake2b-400',\\n 0xb233: 'blake2b-408',\\n 0xb234: 'blake2b-416',\\n 0xb235: 'blake2b-424',\\n 0xb236: 'blake2b-432',\\n 0xb237: 'blake2b-440',\\n 0xb238: 'blake2b-448',\\n 0xb239: 'blake2b-456',\\n 0xb23a: 'blake2b-464',\\n 0xb23b: 'blake2b-472',\\n 0xb23c: 'blake2b-480',\\n 0xb23d: 'blake2b-488',\\n 0xb23e: 'blake2b-496',\\n 0xb23f: 'blake2b-504',\\n 0xb240: 'blake2b-512',\\n 0xb241: 'blake2s-8',\\n 0xb242: 'blake2s-16',\\n 0xb243: 'blake2s-24',\\n 0xb244: 'blake2s-32',\\n 0xb245: 'blake2s-40',\\n 0xb246: 'blake2s-48',\\n 0xb247: 'blake2s-56',\\n 0xb248: 'blake2s-64',\\n 0xb249: 'blake2s-72',\\n 0xb24a: 'blake2s-80',\\n 0xb24b: 'blake2s-88',\\n 0xb24c: 'blake2s-96',\\n 0xb24d: 'blake2s-104',\\n 0xb24e: 'blake2s-112',\\n 0xb24f: 'blake2s-120',\\n 0xb250: 'blake2s-128',\\n 0xb251: 'blake2s-136',\\n 0xb252: 'blake2s-144',\\n 0xb253: 'blake2s-152',\\n 0xb254: 'blake2s-160',\\n 0xb255: 'blake2s-168',\\n 0xb256: 'blake2s-176',\\n 0xb257: 'blake2s-184',\\n 0xb258: 'blake2s-192',\\n 0xb259: 'blake2s-200',\\n 0xb25a: 'blake2s-208',\\n 0xb25b: 'blake2s-216',\\n 0xb25c: 'blake2s-224',\\n 0xb25d: 'blake2s-232',\\n 0xb25e: 'blake2s-240',\\n 0xb25f: 'blake2s-248',\\n 0xb260: 'blake2s-256',\\n\\n // skein\\n 0xb301: 'Skein256-8',\\n 0xb302: 'Skein256-16',\\n 0xb303: 'Skein256-24',\\n 0xb304: 'Skein256-32',\\n 0xb305: 'Skein256-40',\\n 0xb306: 'Skein256-48',\\n 0xb307: 'Skein256-56',\\n 0xb308: 'Skein256-64',\\n 0xb309: 'Skein256-72',\\n 0xb30a: 'Skein256-80',\\n 0xb30b: 'Skein256-88',\\n 0xb30c: 'Skein256-96',\\n 0xb30d: 'Skein256-104',\\n 0xb30e: 'Skein256-112',\\n 0xb30f: 'Skein256-120',\\n 0xb310: 'Skein256-128',\\n 0xb311: 'Skein256-136',\\n 0xb312: 'Skein256-144',\\n 0xb313: 'Skein256-152',\\n 0xb314: 'Skein256-160',\\n 0xb315: 'Skein256-168',\\n 0xb316: 'Skein256-176',\\n 0xb317: 'Skein256-184',\\n 0xb318: 'Skein256-192',\\n 0xb319: 'Skein256-200',\\n 0xb31a: 'Skein256-208',\\n 0xb31b: 'Skein256-216',\\n 0xb31c: 'Skein256-224',\\n 0xb31d: 'Skein256-232',\\n 0xb31e: 'Skein256-240',\\n 0xb31f: 'Skein256-248',\\n 0xb320: 'Skein256-256',\\n 0xb321: 'Skein512-8',\\n 0xb322: 'Skein512-16',\\n 0xb323: 'Skein512-24',\\n 0xb324: 'Skein512-32',\\n 0xb325: 'Skein512-40',\\n 0xb326: 'Skein512-48',\\n 0xb327: 'Skein512-56',\\n 0xb328: 'Skein512-64',\\n 0xb329: 'Skein512-72',\\n 0xb32a: 'Skein512-80',\\n 0xb32b: 'Skein512-88',\\n 0xb32c: 'Skein512-96',\\n 0xb32d: 'Skein512-104',\\n 0xb32e: 'Skein512-112',\\n 0xb32f: 'Skein512-120',\\n 0xb330: 'Skein512-128',\\n 0xb331: 'Skein512-136',\\n 0xb332: 'Skein512-144',\\n 0xb333: 'Skein512-152',\\n 0xb334: 'Skein512-160',\\n 0xb335: 'Skein512-168',\\n 0xb336: 'Skein512-176',\\n 0xb337: 'Skein512-184',\\n 0xb338: 'Skein512-192',\\n 0xb339: 'Skein512-200',\\n 0xb33a: 'Skein512-208',\\n 0xb33b: 'Skein512-216',\\n 0xb33c: 'Skein512-224',\\n 0xb33d: 'Skein512-232',\\n 0xb33e: 'Skein512-240',\\n 0xb33f: 'Skein512-248',\\n 0xb340: 'Skein512-256',\\n 0xb341: 'Skein512-264',\\n 0xb342: 'Skein512-272',\\n 0xb343: 'Skein512-280',\\n 0xb344: 'Skein512-288',\\n 0xb345: 'Skein512-296',\\n 0xb346: 'Skein512-304',\\n 0xb347: 'Skein512-312',\\n 0xb348: 'Skein512-320',\\n 0xb349: 'Skein512-328',\\n 0xb34a: 'Skein512-336',\\n 0xb34b: 'Skein512-344',\\n 0xb34c: 'Skein512-352',\\n 0xb34d: 'Skein512-360',\\n 0xb34e: 'Skein512-368',\\n 0xb34f: 'Skein512-376',\\n 0xb350: 'Skein512-384',\\n 0xb351: 'Skein512-392',\\n 0xb352: 'Skein512-400',\\n 0xb353: 'Skein512-408',\\n 0xb354: 'Skein512-416',\\n 0xb355: 'Skein512-424',\\n 0xb356: 'Skein512-432',\\n 0xb357: 'Skein512-440',\\n 0xb358: 'Skein512-448',\\n 0xb359: 'Skein512-456',\\n 0xb35a: 'Skein512-464',\\n 0xb35b: 'Skein512-472',\\n 0xb35c: 'Skein512-480',\\n 0xb35d: 'Skein512-488',\\n 0xb35e: 'Skein512-496',\\n 0xb35f: 'Skein512-504',\\n 0xb360: 'Skein512-512',\\n 0xb361: 'Skein1024-8',\\n 0xb362: 'Skein1024-16',\\n 0xb363: 'Skein1024-24',\\n 0xb364: 'Skein1024-32',\\n 0xb365: 'Skein1024-40',\\n 0xb366: 'Skein1024-48',\\n 0xb367: 'Skein1024-56',\\n 0xb368: 'Skein1024-64',\\n 0xb369: 'Skein1024-72',\\n 0xb36a: 'Skein1024-80',\\n 0xb36b: 'Skein1024-88',\\n 0xb36c: 'Skein1024-96',\\n 0xb36d: 'Skein1024-104',\\n 0xb36e: 'Skein1024-112',\\n 0xb36f: 'Skein1024-120',\\n 0xb370: 'Skein1024-128',\\n 0xb371: 'Skein1024-136',\\n 0xb372: 'Skein1024-144',\\n 0xb373: 'Skein1024-152',\\n 0xb374: 'Skein1024-160',\\n 0xb375: 'Skein1024-168',\\n 0xb376: 'Skein1024-176',\\n 0xb377: 'Skein1024-184',\\n 0xb378: 'Skein1024-192',\\n 0xb379: 'Skein1024-200',\\n 0xb37a: 'Skein1024-208',\\n 0xb37b: 'Skein1024-216',\\n 0xb37c: 'Skein1024-224',\\n 0xb37d: 'Skein1024-232',\\n 0xb37e: 'Skein1024-240',\\n 0xb37f: 'Skein1024-248',\\n 0xb380: 'Skein1024-256',\\n 0xb381: 'Skein1024-264',\\n 0xb382: 'Skein1024-272',\\n 0xb383: 'Skein1024-280',\\n 0xb384: 'Skein1024-288',\\n 0xb385: 'Skein1024-296',\\n 0xb386: 'Skein1024-304',\\n 0xb387: 'Skein1024-312',\\n 0xb388: 'Skein1024-320',\\n 0xb389: 'Skein1024-328',\\n 0xb38a: 'Skein1024-336',\\n 0xb38b: 'Skein1024-344',\\n 0xb38c: 'Skein1024-352',\\n 0xb38d: 'Skein1024-360',\\n 0xb38e: 'Skein1024-368',\\n 0xb38f: 'Skein1024-376',\\n 0xb390: 'Skein1024-384',\\n 0xb391: 'Skein1024-392',\\n 0xb392: 'Skein1024-400',\\n 0xb393: 'Skein1024-408',\\n 0xb394: 'Skein1024-416',\\n 0xb395: 'Skein1024-424',\\n 0xb396: 'Skein1024-432',\\n 0xb397: 'Skein1024-440',\\n 0xb398: 'Skein1024-448',\\n 0xb399: 'Skein1024-456',\\n 0xb39a: 'Skein1024-464',\\n 0xb39b: 'Skein1024-472',\\n 0xb39c: 'Skein1024-480',\\n 0xb39d: 'Skein1024-488',\\n 0xb39e: 'Skein1024-496',\\n 0xb39f: 'Skein1024-504',\\n 0xb3a0: 'Skein1024-512',\\n 0xb3a1: 'Skein1024-520',\\n 0xb3a2: 'Skein1024-528',\\n 0xb3a3: 'Skein1024-536',\\n 0xb3a4: 'Skein1024-544',\\n 0xb3a5: 'Skein1024-552',\\n 0xb3a6: 'Skein1024-560',\\n 0xb3a7: 'Skein1024-568',\\n 0xb3a8: 'Skein1024-576',\\n 0xb3a9: 'Skein1024-584',\\n 0xb3aa: 'Skein1024-592',\\n 0xb3ab: 'Skein1024-600',\\n 0xb3ac: 'Skein1024-608',\\n 0xb3ad: 'Skein1024-616',\\n 0xb3ae: 'Skein1024-624',\\n 0xb3af: 'Skein1024-632',\\n 0xb3b0: 'Skein1024-640',\\n 0xb3b1: 'Skein1024-648',\\n 0xb3b2: 'Skein1024-656',\\n 0xb3b3: 'Skein1024-664',\\n 0xb3b4: 'Skein1024-672',\\n 0xb3b5: 'Skein1024-680',\\n 0xb3b6: 'Skein1024-688',\\n 0xb3b7: 'Skein1024-696',\\n 0xb3b8: 'Skein1024-704',\\n 0xb3b9: 'Skein1024-712',\\n 0xb3ba: 'Skein1024-720',\\n 0xb3bb: 'Skein1024-728',\\n 0xb3bc: 'Skein1024-736',\\n 0xb3bd: 'Skein1024-744',\\n 0xb3be: 'Skein1024-752',\\n 0xb3bf: 'Skein1024-760',\\n 0xb3c0: 'Skein1024-768',\\n 0xb3c1: 'Skein1024-776',\\n 0xb3c2: 'Skein1024-784',\\n 0xb3c3: 'Skein1024-792',\\n 0xb3c4: 'Skein1024-800',\\n 0xb3c5: 'Skein1024-808',\\n 0xb3c6: 'Skein1024-816',\\n 0xb3c7: 'Skein1024-824',\\n 0xb3c8: 'Skein1024-832',\\n 0xb3c9: 'Skein1024-840',\\n 0xb3ca: 'Skein1024-848',\\n 0xb3cb: 'Skein1024-856',\\n 0xb3cc: 'Skein1024-864',\\n 0xb3cd: 'Skein1024-872',\\n 0xb3ce: 'Skein1024-880',\\n 0xb3cf: 'Skein1024-888',\\n 0xb3d0: 'Skein1024-896',\\n 0xb3d1: 'Skein1024-904',\\n 0xb3d2: 'Skein1024-912',\\n 0xb3d3: 'Skein1024-920',\\n 0xb3d4: 'Skein1024-928',\\n 0xb3d5: 'Skein1024-936',\\n 0xb3d6: 'Skein1024-944',\\n 0xb3d7: 'Skein1024-952',\\n 0xb3d8: 'Skein1024-960',\\n 0xb3d9: 'Skein1024-968',\\n 0xb3da: 'Skein1024-976',\\n 0xb3db: 'Skein1024-984',\\n 0xb3dc: 'Skein1024-992',\\n 0xb3dd: 'Skein1024-1000',\\n 0xb3de: 'Skein1024-1008',\\n 0xb3df: 'Skein1024-1016',\\n 0xb3e0: 'Skein1024-1024'\\n})\\n\\nexports.defaultLengths = Object.freeze({\\n 0x11: 20,\\n 0x12: 32,\\n 0x13: 64,\\n 0x56: 32,\\n 0x17: 28,\\n 0x16: 32,\\n 0x15: 48,\\n 0x14: 64,\\n 0x18: 32,\\n 0x19: 64,\\n 0x1A: 28,\\n 0x1B: 32,\\n 0x1C: 48,\\n 0x1D: 64,\\n 0x22: 32,\\n\\n 0xb201: 0x01,\\n 0xb202: 0x02,\\n 0xb203: 0x03,\\n 0xb204: 0x04,\\n 0xb205: 0x05,\\n 0xb206: 0x06,\\n 0xb207: 0x07,\\n 0xb208: 0x08,\\n 0xb209: 0x09,\\n 0xb20a: 0x0a,\\n 0xb20b: 0x0b,\\n 0xb20c: 0x0c,\\n 0xb20d: 0x0d,\\n 0xb20e: 0x0e,\\n 0xb20f: 0x0f,\\n 0xb210: 0x10,\\n 0xb211: 0x11,\\n 0xb212: 0x12,\\n 0xb213: 0x13,\\n 0xb214: 0x14,\\n 0xb215: 0x15,\\n 0xb216: 0x16,\\n 0xb217: 0x17,\\n 0xb218: 0x18,\\n 0xb219: 0x19,\\n 0xb21a: 0x1a,\\n 0xb21b: 0x1b,\\n 0xb21c: 0x1c,\\n 0xb21d: 0x1d,\\n 0xb21e: 0x1e,\\n 0xb21f: 0x1f,\\n 0xb220: 0x20,\\n 0xb221: 0x21,\\n 0xb222: 0x22,\\n 0xb223: 0x23,\\n 0xb224: 0x24,\\n 0xb225: 0x25,\\n 0xb226: 0x26,\\n 0xb227: 0x27,\\n 0xb228: 0x28,\\n 0xb229: 0x29,\\n 0xb22a: 0x2a,\\n 0xb22b: 0x2b,\\n 0xb22c: 0x2c,\\n 0xb22d: 0x2d,\\n 0xb22e: 0x2e,\\n 0xb22f: 0x2f,\\n 0xb230: 0x30,\\n 0xb231: 0x31,\\n 0xb232: 0x32,\\n 0xb233: 0x33,\\n 0xb234: 0x34,\\n 0xb235: 0x35,\\n 0xb236: 0x36,\\n 0xb237: 0x37,\\n 0xb238: 0x38,\\n 0xb239: 0x39,\\n 0xb23a: 0x3a,\\n 0xb23b: 0x3b,\\n 0xb23c: 0x3c,\\n 0xb23d: 0x3d,\\n 0xb23e: 0x3e,\\n 0xb23f: 0x3f,\\n 0xb240: 0x40,\\n 0xb241: 0x01,\\n 0xb242: 0x02,\\n 0xb243: 0x03,\\n 0xb244: 0x04,\\n 0xb245: 0x05,\\n 0xb246: 0x06,\\n 0xb247: 0x07,\\n 0xb248: 0x08,\\n 0xb249: 0x09,\\n 0xb24a: 0x0a,\\n 0xb24b: 0x0b,\\n 0xb24c: 0x0c,\\n 0xb24d: 0x0d,\\n 0xb24e: 0x0e,\\n 0xb24f: 0x0f,\\n 0xb250: 0x10,\\n 0xb251: 0x11,\\n 0xb252: 0x12,\\n 0xb253: 0x13,\\n 0xb254: 0x14,\\n 0xb255: 0x15,\\n 0xb256: 0x16,\\n 0xb257: 0x17,\\n 0xb258: 0x18,\\n 0xb259: 0x19,\\n 0xb25a: 0x1a,\\n 0xb25b: 0x1b,\\n 0xb25c: 0x1c,\\n 0xb25d: 0x1d,\\n 0xb25e: 0x1e,\\n 0xb25f: 0x1f,\\n 0xb260: 0x20,\\n 0xb301: 0x01,\\n 0xb302: 0x02,\\n 0xb303: 0x03,\\n 0xb304: 0x04,\\n 0xb305: 0x05,\\n 0xb306: 0x06,\\n 0xb307: 0x07,\\n 0xb308: 0x08,\\n 0xb309: 0x09,\\n 0xb30a: 0x0a,\\n 0xb30b: 0x0b,\\n 0xb30c: 0x0c,\\n 0xb30d: 0x0d,\\n 0xb30e: 0x0e,\\n 0xb30f: 0x0f,\\n 0xb310: 0x10,\\n 0xb311: 0x11,\\n 0xb312: 0x12,\\n 0xb313: 0x13,\\n 0xb314: 0x14,\\n 0xb315: 0x15,\\n 0xb316: 0x16,\\n 0xb317: 0x17,\\n 0xb318: 0x18,\\n 0xb319: 0x19,\\n 0xb31a: 0x1a,\\n 0xb31b: 0x1b,\\n 0xb31c: 0x1c,\\n 0xb31d: 0x1d,\\n 0xb31e: 0x1e,\\n 0xb31f: 0x1f,\\n 0xb320: 0x20,\\n 0xb321: 0x01,\\n 0xb322: 0x02,\\n 0xb323: 0x03,\\n 0xb324: 0x04,\\n 0xb325: 0x05,\\n 0xb326: 0x06,\\n 0xb327: 0x07,\\n 0xb328: 0x08,\\n 0xb329: 0x09,\\n 0xb32a: 0x0a,\\n 0xb32b: 0x0b,\\n 0xb32c: 0x0c,\\n 0xb32d: 0x0d,\\n 0xb32e: 0x0e,\\n 0xb32f: 0x0f,\\n 0xb330: 0x10,\\n 0xb331: 0x11,\\n 0xb332: 0x12,\\n 0xb333: 0x13,\\n 0xb334: 0x14,\\n 0xb335: 0x15,\\n 0xb336: 0x16,\\n 0xb337: 0x17,\\n 0xb338: 0x18,\\n 0xb339: 0x19,\\n 0xb33a: 0x1a,\\n 0xb33b: 0x1b,\\n 0xb33c: 0x1c,\\n 0xb33d: 0x1d,\\n 0xb33e: 0x1e,\\n 0xb33f: 0x1f,\\n 0xb340: 0x20,\\n 0xb341: 0x21,\\n 0xb342: 0x22,\\n 0xb343: 0x23,\\n 0xb344: 0x24,\\n 0xb345: 0x25,\\n 0xb346: 0x26,\\n 0xb347: 0x27,\\n 0xb348: 0x28,\\n 0xb349: 0x29,\\n 0xb34a: 0x2a,\\n 0xb34b: 0x2b,\\n 0xb34c: 0x2c,\\n 0xb34d: 0x2d,\\n 0xb34e: 0x2e,\\n 0xb34f: 0x2f,\\n 0xb350: 0x30,\\n 0xb351: 0x31,\\n 0xb352: 0x32,\\n 0xb353: 0x33,\\n 0xb354: 0x34,\\n 0xb355: 0x35,\\n 0xb356: 0x36,\\n 0xb357: 0x37,\\n 0xb358: 0x38,\\n 0xb359: 0x39,\\n 0xb35a: 0x3a,\\n 0xb35b: 0x3b,\\n 0xb35c: 0x3c,\\n 0xb35d: 0x3d,\\n 0xb35e: 0x3e,\\n 0xb35f: 0x3f,\\n 0xb360: 0x40,\\n 0xb361: 0x01,\\n 0xb362: 0x02,\\n 0xb363: 0x03,\\n 0xb364: 0x04,\\n 0xb365: 0x05,\\n 0xb366: 0x06,\\n 0xb367: 0x07,\\n 0xb368: 0x08,\\n 0xb369: 0x09,\\n 0xb36a: 0x0a,\\n 0xb36b: 0x0b,\\n 0xb36c: 0x0c,\\n 0xb36d: 0x0d,\\n 0xb36e: 0x0e,\\n 0xb36f: 0x0f,\\n 0xb370: 0x10,\\n 0xb371: 0x11,\\n 0xb372: 0x12,\\n 0xb373: 0x13,\\n 0xb374: 0x14,\\n 0xb375: 0x15,\\n 0xb376: 0x16,\\n 0xb377: 0x17,\\n 0xb378: 0x18,\\n 0xb379: 0x19,\\n 0xb37a: 0x1a,\\n 0xb37b: 0x1b,\\n 0xb37c: 0x1c,\\n 0xb37d: 0x1d,\\n 0xb37e: 0x1e,\\n 0xb37f: 0x1f,\\n 0xb380: 0x20,\\n 0xb381: 0x21,\\n 0xb382: 0x22,\\n 0xb383: 0x23,\\n 0xb384: 0x24,\\n 0xb385: 0x25,\\n 0xb386: 0x26,\\n 0xb387: 0x27,\\n 0xb388: 0x28,\\n 0xb389: 0x29,\\n 0xb38a: 0x2a,\\n 0xb38b: 0x2b,\\n 0xb38c: 0x2c,\\n 0xb38d: 0x2d,\\n 0xb38e: 0x2e,\\n 0xb38f: 0x2f,\\n 0xb390: 0x30,\\n 0xb391: 0x31,\\n 0xb392: 0x32,\\n 0xb393: 0x33,\\n 0xb394: 0x34,\\n 0xb395: 0x35,\\n 0xb396: 0x36,\\n 0xb397: 0x37,\\n 0xb398: 0x38,\\n 0xb399: 0x39,\\n 0xb39a: 0x3a,\\n 0xb39b: 0x3b,\\n 0xb39c: 0x3c,\\n 0xb39d: 0x3d,\\n 0xb39e: 0x3e,\\n 0xb39f: 0x3f,\\n 0xb3a0: 0x40,\\n 0xb3a1: 0x41,\\n 0xb3a2: 0x42,\\n 0xb3a3: 0x43,\\n 0xb3a4: 0x44,\\n 0xb3a5: 0x45,\\n 0xb3a6: 0x46,\\n 0xb3a7: 0x47,\\n 0xb3a8: 0x48,\\n 0xb3a9: 0x49,\\n 0xb3aa: 0x4a,\\n 0xb3ab: 0x4b,\\n 0xb3ac: 0x4c,\\n 0xb3ad: 0x4d,\\n 0xb3ae: 0x4e,\\n 0xb3af: 0x4f,\\n 0xb3b0: 0x50,\\n 0xb3b1: 0x51,\\n 0xb3b2: 0x52,\\n 0xb3b3: 0x53,\\n 0xb3b4: 0x54,\\n 0xb3b5: 0x55,\\n 0xb3b6: 0x56,\\n 0xb3b7: 0x57,\\n 0xb3b8: 0x58,\\n 0xb3b9: 0x59,\\n 0xb3ba: 0x5a,\\n 0xb3bb: 0x5b,\\n 0xb3bc: 0x5c,\\n 0xb3bd: 0x5d,\\n 0xb3be: 0x5e,\\n 0xb3bf: 0x5f,\\n 0xb3c0: 0x60,\\n 0xb3c1: 0x61,\\n 0xb3c2: 0x62,\\n 0xb3c3: 0x63,\\n 0xb3c4: 0x64,\\n 0xb3c5: 0x65,\\n 0xb3c6: 0x66,\\n 0xb3c7: 0x67,\\n 0xb3c8: 0x68,\\n 0xb3c9: 0x69,\\n 0xb3ca: 0x6a,\\n 0xb3cb: 0x6b,\\n 0xb3cc: 0x6c,\\n 0xb3cd: 0x6d,\\n 0xb3ce: 0x6e,\\n 0xb3cf: 0x6f,\\n 0xb3d0: 0x70,\\n 0xb3d1: 0x71,\\n 0xb3d2: 0x72,\\n 0xb3d3: 0x73,\\n 0xb3d4: 0x74,\\n 0xb3d5: 0x75,\\n 0xb3d6: 0x76,\\n 0xb3d7: 0x77,\\n 0xb3d8: 0x78,\\n 0xb3d9: 0x79,\\n 0xb3da: 0x7a,\\n 0xb3db: 0x7b,\\n 0xb3dc: 0x7c,\\n 0xb3dd: 0x7d,\\n 0xb3de: 0x7e,\\n 0xb3df: 0x7f,\\n 0xb3e0: 0x80\\n})\\n\\n},{}],62:[function(require,module,exports){\\n/**\\n * Multihash implementation in JavaScript.\\n *\\n * @module multihash\\n */\\n'use strict'\\n\\nconst { Buffer } = require('buffer')\\nconst multibase = require('multibase')\\nconst varint = require('varint')\\nconst cs = require('./constants')\\n\\nexports.names = cs.names\\nexports.codes = cs.codes\\nexports.defaultLengths = cs.defaultLengths\\n\\n/**\\n * Convert the given multihash to a hex encoded string.\\n *\\n * @param {Buffer} hash\\n * @returns {string}\\n */\\nexports.toHexString = function toHexString (hash) {\\n if (!Buffer.isBuffer(hash)) {\\n throw new Error('must be passed a buffer')\\n }\\n\\n return hash.toString('hex')\\n}\\n\\n/**\\n * Convert the given hex encoded string to a multihash.\\n *\\n * @param {string} hash\\n * @returns {Buffer}\\n */\\nexports.fromHexString = function fromHexString (hash) {\\n return Buffer.from(hash, 'hex')\\n}\\n\\n/**\\n * Convert the given multihash to a base58 encoded string.\\n *\\n * @param {Buffer} hash\\n * @returns {string}\\n */\\nexports.toB58String = function toB58String (hash) {\\n if (!Buffer.isBuffer(hash)) {\\n throw new Error('must be passed a buffer')\\n }\\n\\n return multibase.encode('base58btc', hash).toString().slice(1)\\n}\\n\\n/**\\n * Convert the given base58 encoded string to a multihash.\\n *\\n * @param {string|Buffer} hash\\n * @returns {Buffer}\\n */\\nexports.fromB58String = function fromB58String (hash) {\\n let encoded = hash\\n if (Buffer.isBuffer(hash)) {\\n encoded = hash.toString()\\n }\\n\\n return multibase.decode('z' + encoded)\\n}\\n\\n/**\\n * Decode a hash from the given multihash.\\n *\\n * @param {Buffer} buf\\n * @returns {{code: number, name: string, length: number, digest: Buffer}} result\\n */\\nexports.decode = function decode (buf) {\\n if (!(Buffer.isBuffer(buf))) {\\n throw new Error('multihash must be a Buffer')\\n }\\n\\n if (buf.length \u003C 2) {\\n throw new Error('multihash too short. must be > 2 bytes.')\\n }\\n\\n const code = varint.decode(buf)\\n if (!exports.isValidCode(code)) {\\n throw new Error(`multihash unknown function code: 0x${code.toString(16)}`)\\n }\\n buf = buf.slice(varint.decode.bytes)\\n\\n const len = varint.decode(buf)\\n if (len \u003C 0) {\\n throw new Error(`multihash invalid length: ${len}`)\\n }\\n buf = buf.slice(varint.decode.bytes)\\n\\n if (buf.length !== len) {\\n throw new Error(`multihash length inconsistent: 0x${buf.toString('hex')}`)\\n }\\n\\n return {\\n code: code,\\n name: cs.codes[code],\\n length: len,\\n digest: buf\\n }\\n}\\n\\n/**\\n * Encode a hash digest along with the specified function code.\\n *\\n * > **Note:** the length is derived from the length of the digest itself.\\n *\\n * @param {Buffer} digest\\n * @param {string|number} code\\n * @param {number} [length]\\n * @returns {Buffer}\\n */\\nexports.encode = function encode (digest, code, length) {\\n if (!digest || code === undefined) {\\n throw new Error('multihash encode requires at least two args: digest, code')\\n }\\n\\n // ensure it's a hashfunction code.\\n const hashfn = exports.coerceCode(code)\\n\\n if (!(Buffer.isBuffer(digest))) {\\n throw new Error('digest should be a Buffer')\\n }\\n\\n if (length == null) {\\n length = digest.length\\n }\\n\\n if (length && digest.length !== length) {\\n throw new Error('digest length should be equal to specified length.')\\n }\\n\\n return Buffer.concat([\\n Buffer.from(varint.encode(hashfn)),\\n Buffer.from(varint.encode(length)),\\n digest\\n ])\\n}\\n\\n/**\\n * Converts a hash function name into the matching code.\\n * If passed a number it will return the number if it's a valid code.\\n * @param {string|number} name\\n * @returns {number}\\n */\\nexports.coerceCode = function coerceCode (name) {\\n let code = name\\n\\n if (typeof name === 'string') {\\n if (cs.names[name] === undefined) {\\n throw new Error(`Unrecognized hash function named: ${name}`)\\n }\\n code = cs.names[name]\\n }\\n\\n if (typeof code !== 'number') {\\n throw new Error(`Hash function code should be a number. Got: ${code}`)\\n }\\n\\n if (cs.codes[code] === undefined && !exports.isAppCode(code)) {\\n throw new Error(`Unrecognized function code: ${code}`)\\n }\\n\\n return code\\n}\\n\\n/**\\n * Checks wether a code is part of the app range\\n *\\n * @param {number} code\\n * @returns {boolean}\\n */\\nexports.isAppCode = function appCode (code) {\\n return code > 0 && code \u003C 0x10\\n}\\n\\n/**\\n * Checks whether a multihash code is valid.\\n *\\n * @param {number} code\\n * @returns {boolean}\\n */\\nexports.isValidCode = function validCode (code) {\\n if (exports.isAppCode(code)) {\\n return true\\n }\\n\\n if (cs.codes[code]) {\\n return true\\n }\\n\\n return false\\n}\\n\\n/**\\n * Check if the given buffer is a valid multihash. Throws an error if it is not valid.\\n *\\n * @param {Buffer} multihash\\n * @returns {undefined}\\n * @throws {Error}\\n */\\nfunction validate (multihash) {\\n exports.decode(multihash) // throws if bad.\\n}\\nexports.validate = validate\\n\\n/**\\n * Returns a prefix from a valid multihash. Throws an error if it is not valid.\\n *\\n * @param {Buffer} multihash\\n * @returns {undefined}\\n * @throws {Error}\\n */\\nexports.prefix = function prefix (multihash) {\\n validate(multihash)\\n\\n return multihash.slice(0, 2)\\n}\\n\\n},{\\\"./constants\\\":61,\\\"buffer\\\":5,\\\"multibase\\\":53,\\\"varint\\\":67}],63:[function(require,module,exports){\\n/*! safe-buffer. MIT License. Feross Aboukhadijeh \u003Chttps://feross.org/opensource> */\\n/* eslint-disable node/no-deprecated-api */\\nvar buffer = require('buffer')\\nvar Buffer = buffer.Buffer\\n\\n// alternative to using Object.keys for old browsers\\nfunction copyProps (src, dst) {\\n for (var key in src) {\\n dst[key] = src[key]\\n }\\n}\\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\\n module.exports = buffer\\n} else {\\n // Copy properties from require('buffer')\\n copyProps(buffer, exports)\\n exports.Buffer = SafeBuffer\\n}\\n\\nfunction SafeBuffer (arg, encodingOrOffset, length) {\\n return Buffer(arg, encodingOrOffset, length)\\n}\\n\\nSafeBuffer.prototype = Object.create(Buffer.prototype)\\n\\n// Copy static methods from Buffer\\ncopyProps(Buffer, SafeBuffer)\\n\\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\\n if (typeof arg === 'number') {\\n throw new TypeError('Argument must not be a number')\\n }\\n return Buffer(arg, encodingOrOffset, length)\\n}\\n\\nSafeBuffer.alloc = function (size, fill, encoding) {\\n if (typeof size !== 'number') {\\n throw new TypeError('Argument must be a number')\\n }\\n var buf = Buffer(size)\\n if (fill !== undefined) {\\n if (typeof encoding === 'string') {\\n buf.fill(fill, encoding)\\n } else {\\n buf.fill(fill)\\n }\\n } else {\\n buf.fill(0)\\n }\\n return buf\\n}\\n\\nSafeBuffer.allocUnsafe = function (size) {\\n if (typeof size !== 'number') {\\n throw new TypeError('Argument must be a number')\\n }\\n return Buffer(size)\\n}\\n\\nSafeBuffer.allocUnsafeSlow = function (size) {\\n if (typeof size !== 'number') {\\n throw new TypeError('Argument must be a number')\\n }\\n return buffer.SlowBuffer(size)\\n}\\n\\n},{\\\"buffer\\\":5}],64:[function(require,module,exports){\\n(function (global){\\n\\\"use strict\\\";\\nvar g;\\n\\n\\n\\nif (typeof window !== \\\"undefined\\\")\\n{\\n\\tg = window;\\n}\\nelse if (typeof global !== \\\"undefined\\\")\\n{\\n\\tg = global;\\n}\\nelse if (typeof self !== \\\"undefined\\\")\\n{\\n\\tg = self;\\n}\\nelse\\n{\\n\\tg = this;\\n}\\n\\n\\n\\nvar output =\\n{\\n\\tshim: function(){},\\n\\tURL: g.URL,\\n\\tURLSearchParams: g.URLSearchParams\\n};\\n\\n\\n\\nif (typeof define === \\\"function\\\" && define.amd)\\n{\\n\\tdefine(function(){ return output });\\n}\\nelse if (typeof exports === \\\"object\\\")\\n{\\n\\tmodule.exports = output;\\n}\\nelse\\n{\\n\\tg.UniversalURL = output;\\n}\\n\\n}).call(this,typeof global !== \\\"undefined\\\" ? global : typeof self !== \\\"undefined\\\" ? self : typeof window !== \\\"undefined\\\" ? window : {})\\n},{}],65:[function(require,module,exports){\\nmodule.exports = read\\n\\nvar MSB = 0x80\\n , REST = 0x7F\\n\\nfunction read(buf, offset) {\\n var res = 0\\n , offset = offset || 0\\n , shift = 0\\n , counter = offset\\n , b\\n , l = buf.length\\n\\n do {\\n if (counter >= l) {\\n read.bytes = 0\\n throw new RangeError('Could not decode varint')\\n }\\n b = buf[counter++]\\n res += shift \u003C 28\\n ? (b & REST) \u003C\u003C shift\\n : (b & REST) * Math.pow(2, shift)\\n shift += 7\\n } while (b >= MSB)\\n\\n read.bytes = counter - offset\\n\\n return res\\n}\\n\\n},{}],66:[function(require,module,exports){\\nmodule.exports = encode\\n\\nvar MSB = 0x80\\n , REST = 0x7F\\n , MSBALL = ~REST\\n , INT = Math.pow(2, 31)\\n\\nfunction encode(num, out, offset) {\\n out = out || []\\n offset = offset || 0\\n var oldOffset = offset\\n\\n while(num >= INT) {\\n out[offset++] = (num & 0xFF) | MSB\\n num /= 128\\n }\\n while(num & MSBALL) {\\n out[offset++] = (num & 0xFF) | MSB\\n num >>>= 7\\n }\\n out[offset] = num | 0\\n \\n encode.bytes = offset - oldOffset + 1\\n \\n return out\\n}\\n\\n},{}],67:[function(require,module,exports){\\nmodule.exports = {\\n encode: require('./encode.js')\\n , decode: require('./decode.js')\\n , encodingLength: require('./length.js')\\n}\\n\\n},{\\\"./decode.js\\\":65,\\\"./encode.js\\\":66,\\\"./length.js\\\":68}],68:[function(require,module,exports){\\n\\nvar N1 = Math.pow(2, 7)\\nvar N2 = Math.pow(2, 14)\\nvar N3 = Math.pow(2, 21)\\nvar N4 = Math.pow(2, 28)\\nvar N5 = Math.pow(2, 35)\\nvar N6 = Math.pow(2, 42)\\nvar N7 = Math.pow(2, 49)\\nvar N8 = Math.pow(2, 56)\\nvar N9 = Math.pow(2, 63)\\n\\nmodule.exports = function (value) {\\n return (\\n value \u003C N1 ? 1\\n : value \u003C N2 ? 2\\n : value \u003C N3 ? 3\\n : value \u003C N4 ? 4\\n : value \u003C N5 ? 5\\n : value \u003C N6 ? 6\\n : value \u003C N7 ? 7\\n : value \u003C N8 ? 8\\n : value \u003C N9 ? 9\\n : 10\\n )\\n}\\n\\n},{}],69:[function(require,module,exports){\\n(function (global){\\n'use strict'\\nmodule.exports = (typeof self === 'object' && self.self === self && self) ||\\n (typeof global === 'object' && global.global === global && global) ||\\n this\\n\\n}).call(this,typeof global !== \\\"undefined\\\" ? global : typeof self !== \\\"undefined\\\" ? self : typeof window !== \\\"undefined\\\" ? window : {})\\n},{}],70:[function(require,module,exports){\\n\\\"use strict\\\";\\n\\nvar _interopRequireDefault = require(\\\"@babel/runtime/helpers/interopRequireDefault\\\");\\n\\nvar _cids = _interopRequireDefault(require(\\\"cids\\\"));\\n\\nvar _contentHash = _interopRequireDefault(require(\\\"content-hash\\\"));\\n\\nvar _windowOrGlobal = _interopRequireDefault(require(\\\"window-or-global\\\"));\\n\\n(function () {\\n /*jslint node: true, browser: true*/\\n 'use strict';\\n\\n const name = 'ens-library'; // https://github.com/ensdomains/resolvers\\n\\n var EnsLibrary = function (ipfsLoader) {\\n this.ipfsLoader = ipfsLoader;\\n this.network = {\\n 1: 'Ethereum Main Network: \\\"Mainnet\\\", chainId: \\\"1\\\"',\\n 3: 'Ethereum Test Network (PoW): \\\"Ropsten\\\", chainId: \\\"3\\\"',\\n 4: 'Ethereum Test Network (PoA): \\\"Rinkeby\\\", chainId: \\\"4\\\"',\\n 5: 'Ethereum Test Network (PoA): \\\"Goerli\\\", chainId: \\\"5\\\"',\\n 42: 'Ethereum Test Network (PoA): \\\"Kovan\\\", chainId: \\\"42\\\"'\\n };\\n this.etherscan = {\\n 1: 'https://etherscan.io',\\n 3: 'https://ropsten.etherscan.io',\\n 4: 'https://rinkeby.etherscan.io',\\n 5: 'https://goerli.etherscan.io',\\n 42: 'https://kovan.etherscan.io'\\n }; // https://docs.ens.domains/ens-deployments\\n // https://github.com/ensdomains/ui/blob/master/src/ens.js\\n\\n this.registry = {\\n 1: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\\n 3: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\\n 4: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\\n 5: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e'\\n };\\n };\\n\\n EnsLibrary.prototype.getLogger = function () {\\n return _windowOrGlobal.default.log.getLogger(name);\\n };\\n\\n EnsLibrary.prototype.getEtherscanRegistry = function () {\\n return this.etherscan;\\n };\\n\\n EnsLibrary.prototype.getNetwork = function () {\\n return this.network;\\n };\\n\\n EnsLibrary.prototype.getENSRegistry = function () {\\n return this.registry;\\n };\\n\\n EnsLibrary.prototype.loadEthers = async function () {\\n if (_windowOrGlobal.default.ethers === undefined || _windowOrGlobal.default.ethers == null) {\\n try {\\n // Load ethers\\n await this.ipfsLoader.loadEtherJsLibrary();\\n\\n if (_windowOrGlobal.default.ethers !== undefined && _windowOrGlobal.default.ethers !== null) {\\n return;\\n }\\n } catch (error) {\\n this.getLogger().error(error);\\n } // Should not happen...\\n\\n\\n throw new Error('Unavailable Ethereum library...');\\n }\\n }; // https://github.com/ensdomains/ui/blob/master/src/utils/contents.js\\n\\n\\n EnsLibrary.prototype.decodeContenthash = function (content) {\\n var decoded = null;\\n var protocol = null;\\n\\n if (content.error) {\\n throw new Error(content.error);\\n }\\n\\n if (content) {\\n const codec = _contentHash.default.getCodec(content);\\n\\n decoded = _contentHash.default.decode(content);\\n\\n if (codec === 'ipfs-ns') {\\n protocol = 'ipfs';\\n } else if (codec === 'swarm-ns') {\\n protocol = 'bzz';\\n } else if (codec === 'onion') {\\n protocol = 'onion';\\n } else if (codec === 'onion3') {\\n protocol = 'onion3';\\n }\\n }\\n\\n return {\\n decoded: decoded,\\n protocol: protocol\\n };\\n }; // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1577.md\\n\\n\\n EnsLibrary.prototype.encodeContenthash = function (content) {\\n var type = null;\\n var text = null;\\n var encoded = null;\\n content = content === undefined || content == null || content.trim() === '' ? null : content.trim();\\n\\n if (content == null) {\\n return null;\\n }\\n\\n const matched = content.match(/^(ipfs|bzz|onion|onion3):\\\\/\\\\/(.*)/) || content.match(/\\\\/(ipfs)\\\\/(.*)/);\\n\\n if (matched) {\\n type = matched[1];\\n text = matched[2];\\n }\\n\\n if (type === 'ipfs') {\\n if (text.length >= 4) {\\n const cid = new _cids.default(text);\\n\\n if (cid.version !== 0) {\\n throw new Error(`ENS domain content should be Base58 (CidV0): ${text}`);\\n }\\n\\n encoded = '0x' + _contentHash.default.fromIpfs(text);\\n }\\n } else {\\n throw new Error(`Unsupported ENS domain protocol: ${type}`);\\n }\\n\\n return {\\n encoded: encoded\\n };\\n };\\n\\n EnsLibrary.prototype.enableProvider = async function (provider) {\\n if (provider === undefined || provider == null) {\\n throw new Error('Undefined Ethereum provider...');\\n } // Enable Provider\\n\\n\\n var accounts = null; // Handle connection, per EIP 1102\\n\\n if (typeof provider.send === 'function') {\\n try {\\n await provider.send('eth_requestAccounts');\\n } catch (error) {\\n // EIP 1193 userRejectedRequest error\\n if (error.code === 4001) {\\n throw new Error('User rejected request...');\\n }\\n\\n throw new Error(error.message);\\n } // Handle user accounts per EIP 1193\\n\\n\\n accounts = await provider.send('eth_accounts'); // https://medium.com/metamask/breaking-changes-to-the-metamask-inpage-provider-b4dde069dd0a\\n // Metamask returns accounts.results rather than an array as described in their above communication\\n\\n if (accounts !== undefined && accounts !== null && typeof accounts.result !== 'undefined' && Array.isArray(accounts.result)) {\\n accounts = accounts.result;\\n } // Legacy\\n\\n } else if (typeof provider.enable === 'function') {\\n accounts = await provider.enable();\\n }\\n\\n if (accounts === undefined || accounts == null || Array.isArray(accounts) === false || accounts.length === 0) {\\n throw new Error('Unable to retrieve an Ethereum account...');\\n } // Return First account\\n\\n\\n return accounts[0];\\n };\\n\\n EnsLibrary.prototype.getProvider = function () {\\n // Retrieve an available Ethereum provider\\n var provider = null;\\n\\n if (typeof _windowOrGlobal.default.ethereum !== 'undefined') {\\n provider = _windowOrGlobal.default.ethereum;\\n this.getLogger().info('Ethereum provider: \\\"window.ethereum\\\"...');\\n }\\n\\n if (provider == null && _windowOrGlobal.default.web3 !== undefined && _windowOrGlobal.default.web3.currentProvider !== undefined) {\\n provider = _windowOrGlobal.default.web3.currentProvider;\\n this.getLogger().info('Ethereum provider: \\\"window.web3.currentProvider\\\"...');\\n }\\n\\n if (provider == null) {\\n throw new Error('Unable to retrieve an Ethereum provider...');\\n } // https://docs.metamask.io/guide/ethereum-provider.html#methods-current-api\\n\\n\\n if (provider.isMetaMask) {\\n provider.autoRefreshOnNetworkChange = false;\\n } // return provider\\n\\n\\n return provider;\\n };\\n\\n EnsLibrary.prototype.getEnabledWeb3Provider = async function (provider) {\\n if (provider === undefined || provider == null) {\\n throw new Error('Undefined Ethereum provider...');\\n }\\n\\n if (_windowOrGlobal.default.ethers === undefined || _windowOrGlobal.default.ethers == null) {\\n await this.loadEthers();\\n } // Enable provider\\n // https://github.com/ethers-io/ethers.js/issues/433\\n\\n\\n const account = await this.enableProvider(provider); // Instantiate a Web3Provider\\n\\n const web3 = new _windowOrGlobal.default.ethers.providers.Web3Provider(provider); // Retrieve current network\\n\\n const network = await web3.getNetwork();\\n return {\\n web3: web3,\\n chainId: network.chainId,\\n account: account\\n };\\n };\\n\\n EnsLibrary.prototype.getWeb3Provider = async function (provider) {\\n if (provider === undefined || provider == null) {\\n throw new Error('Undefined Ethereum provider...');\\n }\\n\\n if (_windowOrGlobal.default.ethers === undefined || _windowOrGlobal.default.ethers == null) {\\n await this.loadEthers();\\n } // Instantiate an ethers Web3Provider\\n\\n\\n const web3 = new _windowOrGlobal.default.ethers.providers.Web3Provider(provider); // Retrieve the current network\\n\\n const network = await web3.getNetwork();\\n return {\\n web3: web3,\\n chainId: network.chainId\\n };\\n };\\n\\n EnsLibrary.prototype.getRegistry = async function (web3) {\\n if (web3 === undefined || web3 == null) {\\n throw new Error('Undefined Web3 provider...');\\n } // Retrieve network\\n\\n\\n const network = await web3.getNetwork(); // Retrieve an Ethereum ENS Registry address\\n\\n var registry = null;\\n\\n try {\\n registry = this.registry[network.chainId];\\n } catch (error) {\\n this.getLogger().error(error);\\n }\\n\\n if (registry === undefined || registry == null) {\\n throw new Error(`Unsupported Ethereum network: ${network.chainId}`);\\n } // Return registry address\\n\\n\\n return {\\n chainId: network.chainId,\\n registry: registry\\n };\\n };\\n\\n EnsLibrary.prototype.getResolver = async function (web3, registry, node) {\\n if (web3 === undefined || web3 == null) {\\n throw new Error('Undefined Web3 provider...');\\n }\\n\\n node = node === undefined || node == null || node.trim() === '' ? null : node.trim();\\n\\n if (node == null) {\\n throw new Error('Undefined ENS domain resolver...');\\n }\\n\\n registry = registry === undefined || registry == null || registry.trim() === '' ? null : registry.trim();\\n\\n if (registry == null) {\\n throw new Error('Undefined ENS registry address...');\\n }\\n\\n if (_windowOrGlobal.default.ethers === undefined || _windowOrGlobal.default.ethers == null) {\\n await this.loadEthers();\\n } // Low level call\\n\\n\\n const abi = [{\\n name: 'resolver',\\n type: 'function',\\n inputs: [{\\n type: 'bytes32'\\n }]\\n }];\\n const iface = new _windowOrGlobal.default.ethers.utils.Interface(abi);\\n const data = iface.functions.resolver.encode([node]);\\n const result = await web3.call({\\n to: registry,\\n data: data\\n });\\n\\n if (result === undefined || result == null || result === '0x') {\\n return null;\\n } // decode if applicable\\n\\n\\n try {\\n const decoded = _windowOrGlobal.default.ethers.utils.defaultAbiCoder.decode(['address'], result);\\n\\n return decoded[0];\\n } catch (error) {\\n this.getLogger().error(error);\\n } // Return\\n\\n\\n return null;\\n }; // https://eips.ethereum.org/EIPS/eip-165\\n\\n\\n EnsLibrary.prototype.checkEip165 = async function (web3, address) {\\n if (web3 === undefined || web3 == null) {\\n throw new Error('Undefined Web3 provider...');\\n }\\n\\n address = address === undefined || address == null || address.trim() === '' ? null : address.trim();\\n\\n if (address == null) {\\n throw new Error('Undefined Ethereum address...');\\n }\\n\\n if (_windowOrGlobal.default.ethers === undefined || _windowOrGlobal.default.ethers == null) {\\n await this.loadEthers();\\n } // true when interfaceID is 0x01ffc9a7\\n\\n\\n var abi = [{\\n name: 'supportsInterface',\\n type: 'function',\\n inputs: [{\\n type: 'bytes4'\\n }]\\n }];\\n var iface = new _windowOrGlobal.default.ethers.utils.Interface(abi);\\n var data = iface.functions.supportsInterface.encode(['0x01ffc9a7']);\\n var result = await web3.call({\\n to: address,\\n data: data\\n });\\n\\n if (result === undefined || result == null || result === '0x') {\\n return false;\\n } // decode\\n\\n\\n try {\\n var decoded = _windowOrGlobal.default.ethers.utils.defaultAbiCoder.decode(['bool'], result);\\n\\n if (decoded[0] === false) {\\n return false;\\n }\\n } catch (error) {\\n this.getLogger().error(error);\\n return false;\\n } // false when interfaceID is 0xffffffff\\n\\n\\n var data = iface.functions.supportsInterface.encode(['0xffffffff']);\\n var result = await web3.call({\\n to: address,\\n data: data\\n });\\n\\n if (result === undefined || result == null || result === '0x') {\\n return false;\\n } // decode\\n\\n\\n try {\\n var decoded = _windowOrGlobal.default.ethers.utils.defaultAbiCoder.decode(['bool'], result); // conform to spec\\n\\n\\n if (decoded[0] === false) {\\n return true;\\n }\\n } catch (error) {\\n this.getLogger().error(error);\\n } // do not conform to spec\\n\\n\\n return false;\\n }; // https://eips.ethereum.org/EIPS/eip-1577\\n\\n\\n EnsLibrary.prototype.checkEip1577 = async function (web3, address) {\\n if (web3 === undefined || web3 == null) {\\n throw new Error('Undefined Web3 provider...');\\n }\\n\\n address = address === undefined || address == null || address.trim() === '' ? null : address.trim();\\n\\n if (address == null) {\\n throw new Error('Undefined Ethereum address...');\\n }\\n\\n if (_windowOrGlobal.default.ethers === undefined || _windowOrGlobal.default.ethers == null) {\\n await this.loadEthers();\\n } // contenthash, true when interfaceID is 0xbc1c58d1\\n\\n\\n var abi = [{\\n name: 'supportsInterface',\\n type: 'function',\\n inputs: [{\\n type: 'bytes4'\\n }]\\n }];\\n var iface = new _windowOrGlobal.default.ethers.utils.Interface(abi);\\n var data = iface.functions.supportsInterface.encode(['0xbc1c58d1']);\\n var result = await web3.call({\\n to: address,\\n data: data\\n });\\n\\n if (result === undefined || result == null || result === '0x') {\\n return false;\\n }\\n\\n try {\\n // decode\\n var decoded = _windowOrGlobal.default.ethers.utils.defaultAbiCoder.decode(['bool'], result);\\n\\n if (decoded[0] === false) {\\n return false;\\n }\\n } catch (error) {\\n this.getLogger().error(error);\\n return false;\\n } // return\\n\\n\\n return true;\\n };\\n\\n EnsLibrary.prototype.getContentHash = async function (domain, web3) {\\n if (_windowOrGlobal.default.ethers === undefined || _windowOrGlobal.default.ethers == null) {\\n await this.loadEthers();\\n }\\n\\n domain = domain === undefined || domain == null || domain.trim() === '' ? null : domain.trim();\\n\\n if (domain == null) {\\n throw new Error('Undefined ENS domain...');\\n }\\n\\n if (web3 === undefined) {\\n var {\\n web3\\n } = await this.getWeb3Provider();\\n } // Resolve domain as namehash\\n\\n\\n const domainHash = _windowOrGlobal.default.ethers.utils.namehash(domain); // Fetch ens registry address\\n\\n\\n const {\\n chainId,\\n registry\\n } = await this.getRegistry(web3); // Log\\n\\n this.getLogger().info(`ENS registry: \\\\n ${this.etherscan[chainId]}/address/${registry}`); // Fetch resolver address\\n\\n var resolver = await this.getResolver(web3, registry, domainHash); // Check\\n\\n if (resolver == null || /^0x0+$/.test(resolver) === true) {\\n throw new Error('Undefined ENS domain resolver...');\\n } // Log\\n\\n\\n this.getLogger().info(`ENS domain resolver:\\\\n ${this.etherscan[chainId]}/address/${resolver}`); // Check if resolver is EIP165\\n\\n const eip165 = await this.checkEip165(web3, resolver);\\n\\n if (eip165 === false) {\\n throw new Error('ENS domain resolver do not conform to EIP165...');\\n } // Check if resolver is EIP1577\\n\\n\\n const eip1577 = await this.checkEip1577(web3, resolver);\\n\\n if (eip1577 === false) {\\n throw new Error('ENS domain resolver do not conform to EIP1577...');\\n } // Retrieve content hash\\n\\n\\n this.getLogger().info('Processing ENS domain content...');\\n const abi = [{\\n name: 'contenthash',\\n type: 'function',\\n inputs: [{\\n type: 'bytes32'\\n }]\\n }];\\n const iface = new _windowOrGlobal.default.ethers.utils.Interface(abi);\\n const data = iface.functions.contenthash.encode([domainHash]);\\n const result = await web3.call({\\n to: resolver,\\n data: data\\n });\\n\\n if (result === undefined || result == null || result === '0x') {\\n return {\\n content: null,\\n protocol: null\\n };\\n } // decode bytes result\\n\\n\\n var content = _windowOrGlobal.default.ethers.utils.defaultAbiCoder.decode(['bytes'], result);\\n\\n if (content === undefined || content == null || Array.isArray(content) === false || content[0] === '0x') {\\n return {\\n content: null,\\n protocol: null\\n };\\n } // Decode content hash\\n\\n\\n var {\\n decoded,\\n protocol\\n } = this.decodeContenthash(content[0]);\\n return {\\n content: decoded,\\n protocol: protocol\\n };\\n };\\n\\n EnsLibrary.prototype.isOwner = async function (domain, web3, account) {\\n if (_windowOrGlobal.default.ethers === undefined || _windowOrGlobal.default.ethers == null) {\\n await this.loadEthers();\\n }\\n\\n domain = domain === undefined || domain == null || domain.trim() === '' ? null : domain.trim();\\n\\n if (domain == null) {\\n throw new Error('Undefined ENS domain...');\\n }\\n\\n if (web3 === undefined || account === undefined) {\\n var {\\n web3,\\n account\\n } = await this.getEnabledWeb3Provider();\\n } // Resolve domain as namehash\\n\\n\\n const domainHash = _windowOrGlobal.default.ethers.utils.namehash(domain); // Fetch ens registry address\\n\\n\\n const {\\n chainId,\\n registry\\n } = await this.getRegistry(web3); // Log\\n\\n this.getLogger().info(`ENS registry: \\\\n ${this.etherscan[chainId]}/address/${registry}`);\\n this.getLogger().info('Processing owner...');\\n const abi = [{\\n name: 'owner',\\n type: 'function',\\n inputs: [{\\n type: 'bytes32'\\n }]\\n }];\\n const iface = new _windowOrGlobal.default.ethers.utils.Interface(abi);\\n const data = iface.functions.owner.encode([domainHash]);\\n const result = await web3.call({\\n to: registry,\\n data: data\\n });\\n\\n if (result === undefined || result == null || result === '0x') {\\n return false;\\n } // decode if applicable\\n\\n\\n try {\\n const decoded = _windowOrGlobal.default.ethers.utils.defaultAbiCoder.decode(['address'], result);\\n\\n return decoded[0].toLowerCase() === account.toLowerCase();\\n } catch (error) {\\n this.getLogger().error(error);\\n }\\n\\n return false;\\n };\\n\\n EnsLibrary.prototype.setContentHash = async function (domain, cid, web3, account) {\\n cid = cid === undefined || cid == null || cid.toString().trim() === '' ? null : cid.toString().trim();\\n\\n if (cid == null) {\\n throw new Error('Undefined IPFS identifier...');\\n }\\n\\n domain = domain === undefined || domain == null || domain.trim() === '' ? null : domain.trim();\\n\\n if (domain == null) {\\n throw new Error('Undefined ENS domain...');\\n }\\n\\n if (web3 === undefined || account === undefined) {\\n var {\\n web3,\\n account\\n } = await this.getEnabledWeb3Provider();\\n } // Resolve domain as namehash\\n\\n\\n const domainHash = _windowOrGlobal.default.ethers.utils.namehash(domain); // Fetch ens registry address\\n\\n\\n const {\\n chainId,\\n registry\\n } = await this.getRegistry(web3);\\n this.getLogger().info(`ENS registry:\\\\n ${this.etherscan[chainId]}/address/${registry}`);\\n var resolver = await this.getResolver(web3, registry, domainHash);\\n\\n if (resolver == null || /^0x0+$/.test(resolver) === true) {\\n throw new Error('Undefined ENS resolver...');\\n }\\n\\n this.getLogger().info(`ENS domain resolver:\\\\n ${this.etherscan[chainId]}/address/${resolver}`); // Check if resolver is EIP165\\n\\n const eip165 = await this.checkEip165(web3, resolver);\\n\\n if (eip165 === false) {\\n throw new Error('ENS resolver do not conform to EIP165...');\\n } // Check if resolver is EIP1577\\n\\n\\n const eip1577 = await this.checkEip1577(web3, resolver);\\n\\n if (eip1577 === false) {\\n throw new Error('ENS resolver do not conform to EIP1577...');\\n } // Encode cid\\n\\n\\n const {\\n encoded\\n } = this.encodeContenthash('ipfs://' + cid); // Set Contenthash\\n\\n this.getLogger().info('Processing ENS domain content...');\\n const abi = [{\\n name: 'setContenthash',\\n type: 'function',\\n inputs: [{\\n type: 'bytes32'\\n }, {\\n type: 'bytes'\\n }]\\n }];\\n const iface = new _windowOrGlobal.default.ethers.utils.Interface(abi);\\n const data = iface.functions.setContenthash.encode([domainHash, encoded]);\\n const signer = web3.getSigner();\\n const tx = await signer.sendTransaction({\\n to: resolver,\\n data: data\\n });\\n this.getLogger().info(`Processing Transaction:\\\\n ${this.etherscan[chainId]}/tx/${tx.hash}`); // Wait for transaction completion\\n\\n await tx.wait();\\n this.getLogger().info('Processed ENS domain content...');\\n };\\n\\n module.exports = EnsLibrary;\\n})();\\n\\n},{\\\"@babel/runtime/helpers/interopRequireDefault\\\":2,\\\"cids\\\":7,\\\"content-hash\\\":32,\\\"window-or-global\\\":69}],71:[function(require,module,exports){\\n\\\"use strict\\\";\\n\\nvar _interopRequireDefault = require(\\\"@babel/runtime/helpers/interopRequireDefault\\\");\\n\\nvar _cids = _interopRequireDefault(require(\\\"cids\\\"));\\n\\nvar _windowOrGlobal = _interopRequireDefault(require(\\\"window-or-global\\\"));\\n\\nvar _ensLibrary = _interopRequireDefault(require(\\\"./ens-library\\\"));\\n\\nvar _ipfsLibrary = _interopRequireDefault(require(\\\"./ipfs-library\\\"));\\n\\nvar _ipfsLoader = _interopRequireDefault(require(\\\"./ipfs-loader\\\"));\\n\\nvar _ipfsUrl = _interopRequireDefault(require(\\\"./ipfs-url\\\"));\\n\\n/*\\\\\\ntitle: $:/plugins/ipfs/ipfs-bundle.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: library\\n\\nIPFS Bundle\\n\\n\\\\*/\\n(function () {\\n /*jslint node: true, browser: true*/\\n 'use strict';\\n\\n const cidAnalyser = 'https://cid.ipfs.io/#';\\n const name = 'ipfs-bundle';\\n\\n var IpfsBundle = function () {\\n this.once = false;\\n };\\n\\n IpfsBundle.prototype.getLogger = function () {\\n return _windowOrGlobal.default.log.getLogger(name);\\n };\\n\\n IpfsBundle.prototype.init = function () {\\n // Init once\\n if (this.once) {\\n return;\\n }\\n\\n this.ipfsLoader = new _ipfsLoader.default(this);\\n this.ensLibrary = new _ensLibrary.default(this.ipfsLoader);\\n this.ipfsLibrary = new _ipfsLibrary.default(this);\\n this.ipfsUrl = new _ipfsUrl.default(); // Init once\\n\\n this.once = true;\\n };\\n\\n IpfsBundle.prototype.isJson = function (content) {\\n return this.ipfsLoader.isJson(content);\\n };\\n\\n IpfsBundle.prototype.loadToBase64 = async function (url) {\\n return this.ipfsLoader.loadToBase64(url);\\n };\\n\\n IpfsBundle.prototype.loadToUtf8 = async function (url) {\\n return this.ipfsLoader.loadToUtf8(url);\\n };\\n\\n IpfsBundle.prototype.decodeCid = function (pathname) {\\n // Check\\n if (pathname === undefined || pathname == null || pathname.trim() === '' || pathname.trim() === '/') {\\n return {\\n cid: null,\\n ipnsIdentifier: null,\\n protocol: null\\n };\\n }\\n\\n var identifier = null;\\n var protocol = null; // Parse\\n\\n const members = pathname.trim().split('/');\\n\\n for (var i = 0; i \u003C members.length; i++) {\\n // Ignore\\n if (members[i].trim() === '') {\\n continue;\\n } // First non empty member\\n\\n\\n if (protocol == null) {\\n protocol = members[i];\\n continue;\\n } // Second non empty member\\n\\n\\n if (identifier == null) {\\n identifier = members[i];\\n break;\\n } // Nothing to process\\n\\n\\n break;\\n } // Check\\n\\n\\n if (protocol == null || identifier == null) {\\n return {\\n cid: null,\\n ipnsIdentifier: null,\\n protocol: null\\n };\\n } // Check protocol\\n\\n\\n if (protocol !== 'ipfs' && protocol !== 'ipns') {\\n return {\\n cid: null,\\n ipnsIdentifier: null,\\n protocol: null\\n };\\n } // Check\\n\\n\\n var cid = null;\\n var ipnsIdentifier = null;\\n\\n if (protocol === 'ipns') {\\n ipnsIdentifier = identifier;\\n } else if (this.isCid(identifier)) {\\n cid = identifier;\\n } // All good\\n\\n\\n return {\\n cid: cid,\\n ipnsIdentifier: ipnsIdentifier,\\n protocol: protocol\\n };\\n };\\n\\n IpfsBundle.prototype.isCid = function (cid) {\\n try {\\n const newCid = new _cids.default(cid);\\n return _cids.default.isCID(newCid);\\n } catch (error) {\\n return false;\\n }\\n };\\n\\n IpfsBundle.prototype.cidV1ToCidV0 = function (cidv1) {\\n var cidv0 = new _cids.default(cidv1);\\n\\n if (cidv0.codec !== 'dag-pb') {\\n throw new Error(`This \\\"cid\\\" is not \\\"dag-pb\\\" encoded: ${cidAnalyser}${cidv0}`);\\n }\\n\\n if (cidv0.version === 1) {\\n cidv0 = cidv0.toV0(); // Log\\n\\n this.getLogger().info(`Converted:\\\\n \\\"cidv1\\\" (Base32): ${cidAnalyser}${cidv1} \\\\n to \\\"cidv0\\\" (Base58): ${cidAnalyser}${cidv0}`);\\n } else {\\n // Log\\n this.getLogger().info(`\\\"cidv0\\\" (Base58):\\\\n ${cidAnalyser}${cidv0}`);\\n }\\n\\n return cidv0.toString();\\n };\\n\\n IpfsBundle.prototype.cidV0ToCidV1 = function (cidv0) {\\n var cidv1 = new _cids.default(cidv0);\\n\\n if (cidv1.codec !== 'dag-pb') {\\n throw new Error(`This \\\"cid\\\" is not \\\"dag-pb\\\" encoded: ${cidAnalyser}${cidv1}`);\\n }\\n\\n if (cidv1.version === 0) {\\n cidv1 = cidv1.toV1();\\n this.getLogger().info(`Converted:\\\\n \\\"cidv0\\\" (Base58): ${cidAnalyser}${cidv0} \\\\n to \\\"cidv1\\\" (Base32): ${cidAnalyser}${cidv1}`);\\n } else {\\n // Log\\n this.getLogger().info(`\\\"cidv1\\\" (Base32):\\\\n ${cidAnalyser}${cidv1}`);\\n }\\n\\n return cidv1.toString();\\n };\\n\\n IpfsBundle.prototype.Base64ToUint8Array = function (base64) {\\n var raw = atob(base64);\\n var ua = new Uint8Array(raw.length);\\n\\n for (var i = 0; i \u003C raw.length; i++) {\\n ua[i] = raw.charCodeAt(i);\\n }\\n\\n return ua;\\n };\\n\\n IpfsBundle.prototype.Uint8ArrayToBase64 = function (uint8) {\\n var CHUNK_SIZE = 0x8000; //arbitrary number\\n\\n var index = 0;\\n var length = uint8.length;\\n var str = '';\\n var slice;\\n\\n while (index \u003C length) {\\n slice = uint8.subarray(index, Math.min(index + CHUNK_SIZE, length));\\n str += String.fromCharCode.apply(null, slice);\\n index += CHUNK_SIZE;\\n }\\n\\n return btoa(str);\\n }; // String to uint array\\n\\n\\n IpfsBundle.prototype.StringToUint8Array = function (string) {\\n var escstr = encodeURIComponent(string);\\n var binstr = escstr.replace(/%([0-9A-F]{2})/g, function (match, p1) {\\n return String.fromCharCode('0x' + p1);\\n });\\n var ua = new Uint8Array(binstr.length);\\n Array.prototype.forEach.call(binstr, function (ch, i) {\\n ua[i] = ch.charCodeAt(0);\\n });\\n return ua;\\n }; // http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt\\n\\n /*\\n * utf.js - UTF-8 \u003C=> UTF-16 convertion\\n *\\n * Copyright (C) 1999 Masanao Izumo \u003Ciz@onicos.co.jp>\\n * Version: 1.0\\n * LastModified: Dec 25 1999\\n * This library is free. You can redistribute it and/or modify it.\\n */\\n\\n\\n IpfsBundle.prototype.Utf8ArrayToStr = function (array) {\\n var c, char2, char3;\\n var out = '';\\n var len = array.length;\\n var i = 0;\\n\\n while (i \u003C len) {\\n c = array[i++];\\n\\n switch (c >> 4) {\\n case 0:\\n case 1:\\n case 2:\\n case 3:\\n case 4:\\n case 5:\\n case 6:\\n case 7:\\n // 0xxxxxxx\\n out += String.fromCharCode(c);\\n break;\\n\\n case 12:\\n case 13:\\n // 110x xxxx 10xx xxxx\\n char2 = array[i++];\\n out += String.fromCharCode((c & 0x1f) \u003C\u003C 6 | char2 & 0x3f);\\n break;\\n\\n case 14:\\n // 1110 xxxx 10xx xxxx 10xx xxxx\\n char2 = array[i++];\\n char3 = array[i++];\\n out += String.fromCharCode((c & 0x0f) \u003C\u003C 12 | (char2 & 0x3f) \u003C\u003C 6 | (char3 & 0x3f) \u003C\u003C 0);\\n break;\\n }\\n }\\n\\n return out;\\n };\\n\\n module.exports = {\\n IpfsBundle\\n };\\n})();\\n\\n},{\\\"./ens-library\\\":70,\\\"./ipfs-library\\\":72,\\\"./ipfs-loader\\\":73,\\\"./ipfs-url\\\":74,\\\"@babel/runtime/helpers/interopRequireDefault\\\":2,\\\"cids\\\":7,\\\"window-or-global\\\":69}],72:[function(require,module,exports){\\n(function (Buffer){\\n\\\"use strict\\\";\\n\\nvar _interopRequireDefault = require(\\\"@babel/runtime/helpers/interopRequireDefault\\\");\\n\\nvar _asyncIterator2 = _interopRequireDefault(require(\\\"@babel/runtime/helpers/asyncIterator\\\"));\\n\\nvar _ipfsProvider = require(\\\"ipfs-provider\\\");\\n\\nvar _windowOrGlobal = _interopRequireDefault(require(\\\"window-or-global\\\"));\\n\\n(function () {\\n /*jslint node: true, browser: true */\\n 'use strict';\\n\\n const name = 'ipfs-library';\\n const {\\n httpClient,\\n windowIpfs\\n } = _ipfsProvider.providers;\\n /*\\n * https://github.com/ipfs/js-ipfs/tree/master/docs/core-api\\n **/\\n\\n var IpfsLibrary = function (ipfsBundle) {\\n this.ipfsBundle = ipfsBundle;\\n this.ipfsLoader = ipfsBundle.ipfsLoader;\\n };\\n\\n IpfsLibrary.prototype.getLogger = function () {\\n return _windowOrGlobal.default.log.getLogger(name);\\n };\\n\\n IpfsLibrary.prototype.loadIpfsHttpClient = async function () {\\n const self = this;\\n\\n if (typeof _windowOrGlobal.default.IpfsHttpClient === 'undefined') {\\n try {\\n await this.ipfsLoader.loadIpfsHttpLibrary();\\n\\n if (typeof _windowOrGlobal.default.IpfsHttpClient !== 'undefined') {\\n return;\\n }\\n } catch (error) {\\n self.getLogger().error(error);\\n } // Should not happen...\\n\\n\\n throw new Error('Unavailable IPFS HTTP Client library...');\\n }\\n }; // Default\\n\\n\\n IpfsLibrary.prototype.getDefaultIpfs = async function (apiUrl) {\\n // IPFS Companion first\\n try {\\n const {\\n ipfs,\\n provider\\n } = await this.getWindowIpfs();\\n\\n if (ipfs !== null) {\\n return {\\n ipfs: ipfs,\\n provider: provider\\n };\\n }\\n } catch (error) {// IPFS Companion failed\\n }\\n\\n apiUrl = apiUrl === undefined || apiUrl == null || apiUrl.toString().trim() === '' ? null : apiUrl;\\n\\n if (apiUrl == null) {\\n throw new Error('Undefined IPFS API URL...');\\n } // Load IpfsHttpClient\\n\\n\\n try {\\n const {\\n ipfs,\\n provider\\n } = await this.getHttpIpfs(apiUrl);\\n\\n if (ipfs !== null) {\\n return {\\n ipfs: ipfs,\\n provider: provider\\n };\\n }\\n } catch (error) {// IPFS HTTP client failed\\n }\\n\\n throw new Error('Unable to retrieve IPFS Companion and IPFS API URL...');\\n }; // IPFS companion\\n\\n\\n IpfsLibrary.prototype.getWindowIpfs = async function () {\\n const self = this;\\n\\n try {\\n this.getLogger().info('Processing connection to IPFS Companion...');\\n const {\\n ipfs,\\n provider\\n } = await (0, _ipfsProvider.getIpfs)({\\n providers: [windowIpfs()]\\n });\\n return {\\n ipfs: ipfs,\\n provider: provider\\n };\\n } catch (error) {\\n self.getLogger().error(error);\\n }\\n\\n throw new Error('Unreachable IPFS Companion...');\\n }; // ipfs-http-client\\n\\n\\n IpfsLibrary.prototype.getHttpIpfs = async function (apiUrl) {\\n apiUrl = apiUrl === undefined || apiUrl == null || apiUrl.toString().trim() === '' ? null : apiUrl;\\n\\n if (apiUrl == null) {\\n throw new Error('Undefined IPFS API URL...');\\n }\\n\\n try {\\n if (typeof _windowOrGlobal.default.IpfsHttpClient === 'undefined') {\\n await this.loadIpfsHttpClient();\\n }\\n\\n this.getLogger().info(`Processing connection to IPFS API URL:\\\\n ${apiUrl}`);\\n var protocol = apiUrl.protocol.slice(0, -1);\\n var port = apiUrl.port;\\n\\n if (port === undefined || port == null || port.trim() === '') {\\n port = 443;\\n\\n if (protocol === 'http') {\\n port = 80;\\n }\\n }\\n\\n const {\\n ipfs,\\n provider\\n } = await (0, _ipfsProvider.getIpfs)({\\n providers: [httpClient({\\n apiAddress: {\\n protocol: protocol,\\n host: apiUrl.hostname,\\n port: port,\\n timeout: '4m'\\n }\\n })]\\n });\\n return {\\n ipfs: ipfs,\\n provider: `${provider}, ${apiUrl}`\\n };\\n } catch (error) {\\n this.getLogger().error(error);\\n }\\n\\n throw new Error('Unreachable IPFS API URL...');\\n };\\n\\n IpfsLibrary.prototype.add = async function (client, content) {\\n if (client === undefined || client == null) {\\n throw new Error('Undefined IPFS provider...');\\n }\\n\\n if (content === undefined || content == null) {\\n throw new Error('Undefined content...');\\n } // Window IPFS policy\\n\\n\\n if (client.enable) {\\n client = await client.enable({\\n commands: ['add']\\n });\\n } // Process\\n\\n\\n if (client !== undefined && client.add !== undefined) {\\n // Process\\n var buffer = Buffer.from(content);\\n this.getLogger().info('Processing IPFS add...'); // 1 - https://github.com/ipfs/go-ipfs/issues/5683\\n // default chunker: \\\"size-262144\\\"\\n // chunker: \\\"rabin-262144-524288-1048576\\\"\\n // 2 - TODO: small content generates a wrong cid when cidVersion: 1 is set:\\n // Not a 'dag-pb' but a 'raw' multicodec instead\\n // We generate a V0 and convert it to a V1\\n // https://github.com/xmaysonnave/tiddlywiki-ipfs/issues/14\\n\\n const addSource = await client.add(buffer, {\\n cidVersion: 0,\\n hashAlg: 'sha2-256',\\n chunker: 'rabin-262144-524288-1048576',\\n pin: false\\n }); // https://gist.github.com/alanshaw/04b2ddc35a6fff25c040c011ac6acf26\\n\\n var lastResult = null;\\n var _iteratorNormalCompletion = true;\\n var _didIteratorError = false;\\n\\n var _iteratorError;\\n\\n try {\\n for (var _iterator = (0, _asyncIterator2.default)(addSource), _step, _value; _step = await _iterator.next(), _iteratorNormalCompletion = _step.done, _value = await _step.value, !_iteratorNormalCompletion; _iteratorNormalCompletion = true) {\\n const added = _value;\\n lastResult = added;\\n } // Check\\n\\n } catch (err) {\\n _didIteratorError = true;\\n _iteratorError = err;\\n } finally {\\n try {\\n if (!_iteratorNormalCompletion && _iterator.return != null) {\\n await _iterator.return();\\n }\\n } finally {\\n if (_didIteratorError) {\\n throw _iteratorError;\\n }\\n }\\n }\\n\\n if (lastResult == null || lastResult.path === undefined || lastResult.path == null) {\\n throw new Error('IPFS client returned an unknown result...');\\n }\\n\\n return {\\n hash: this.ipfsBundle.cidV0ToCidV1(lastResult.path),\\n size: lastResult.size\\n };\\n }\\n\\n throw new Error('Undefined IPFS command add...');\\n };\\n\\n IpfsLibrary.prototype.pin = async function (client, cid) {\\n if (client === undefined || client == null) {\\n throw new Error('Undefined IPFS provider...');\\n }\\n\\n cid = cid == null || cid === undefined || cid.trim() === '' ? null : cid.trim();\\n\\n if (cid == null) {\\n throw new Error('Undefined IPFS identifier...');\\n } // Window IPFS policy\\n\\n\\n if (client.enable) {\\n client = await client.enable({\\n commands: ['pin']\\n });\\n } // Process\\n\\n\\n if (client !== undefined && client.pin !== undefined && client.pin.add !== undefined) {\\n this.getLogger().info('Processing IPFS pin add...');\\n const result = await client.pin.add(cid, {\\n recursive: true\\n });\\n return result;\\n }\\n\\n throw new Error('Undefined IPFS pin add...');\\n };\\n\\n IpfsLibrary.prototype.unpin = async function (client, cid) {\\n if (client === undefined || client == null) {\\n throw new Error('Undefined IPFS provider...');\\n }\\n\\n cid = cid == null || cid === undefined || cid.trim() === '' ? null : cid.trim();\\n\\n if (cid == null) {\\n throw new Error('Undefined IPFS identifier...');\\n } // Window IPFS policy\\n\\n\\n if (client.enable) {\\n client = await client.enable({\\n commands: ['pin']\\n });\\n } // Process\\n\\n\\n if (client !== undefined && client.pin !== undefined && client.pin.rm !== undefined) {\\n this.getLogger().info('Processing IPFS pin rm...');\\n const result = await client.pin.rm(cid, {\\n recursive: true\\n });\\n return result;\\n }\\n\\n throw new Error('Undefined IPFS pin rm');\\n };\\n\\n IpfsLibrary.prototype.publish = async function (client, ipnsName, cid) {\\n if (client === undefined || client == null) {\\n throw new Error('Undefined IPFS provider...');\\n }\\n\\n cid = cid == null || cid === undefined || cid.trim() === '' ? null : cid.trim();\\n\\n if (cid == null) {\\n throw new Error('Undefined IPFS identifier...');\\n }\\n\\n ipnsName = ipnsName == null || ipnsName === undefined || ipnsName.trim() === '' ? null : ipnsName.trim();\\n\\n if (ipnsName == null) {\\n throw new Error('Undefined IPNS name...');\\n } // Window IPFS policy\\n\\n\\n if (client.enable) {\\n client = await client.enable({\\n commands: ['name']\\n });\\n }\\n\\n if (client !== undefined && client.name !== undefined && client.name.publish !== undefined) {\\n this.getLogger().info('Processing IPNS name publish...');\\n const result = await client.name.publish(cid, {\\n resolve: true,\\n key: ipnsName,\\n allowOffline: false\\n });\\n\\n if (result === undefined || result == null) {\\n throw new Error('IPFS client returned an unknown result...');\\n }\\n\\n return {\\n name: result.name,\\n value: result.value\\n };\\n }\\n\\n throw new Error('Undefined IPNS name publish...');\\n };\\n\\n IpfsLibrary.prototype.resolve = async function (client, id) {\\n if (client === undefined || client == null) {\\n throw new Error('Undefined IPFS provider...');\\n }\\n\\n id = id == null || id === undefined || id.trim() === '' ? null : id.trim();\\n\\n if (id == null) {\\n throw new Error('Undefined IPNS key...');\\n } // Window IPFS policy\\n\\n\\n if (client.enable) {\\n client = await client.enable({\\n commands: ['name']\\n });\\n }\\n\\n if (client !== undefined && client.name !== undefined && client.name.resolve !== undefined) {\\n this.getLogger().info('Processing IPNS name resolve...');\\n const resolvedSource = await client.name.resolve(id, {\\n nocache: false,\\n recursive: true\\n }); // https://gist.github.com/alanshaw/04b2ddc35a6fff25c040c011ac6acf26\\n\\n var lastResult = null;\\n var _iteratorNormalCompletion2 = true;\\n var _didIteratorError2 = false;\\n\\n var _iteratorError2;\\n\\n try {\\n for (var _iterator2 = (0, _asyncIterator2.default)(resolvedSource), _step2, _value2; _step2 = await _iterator2.next(), _iteratorNormalCompletion2 = _step2.done, _value2 = await _step2.value, !_iteratorNormalCompletion2; _iteratorNormalCompletion2 = true) {\\n const resolved = _value2;\\n lastResult = resolved;\\n }\\n } catch (err) {\\n _didIteratorError2 = true;\\n _iteratorError2 = err;\\n } finally {\\n try {\\n if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\\n await _iterator2.return();\\n }\\n } finally {\\n if (_didIteratorError2) {\\n throw _iteratorError2;\\n }\\n }\\n }\\n\\n if (lastResult == null || lastResult === undefined) {\\n throw new Error('IPFS client returned an unknown result...');\\n }\\n\\n return lastResult;\\n }\\n\\n throw new Error('Undefined IPNS name resolve...');\\n };\\n\\n IpfsLibrary.prototype.getKeys = async function (client) {\\n if (client === undefined || client == null) {\\n throw new Error('Undefined IPFS provider...');\\n } // Window IPFS policy\\n\\n\\n if (client.enable) {\\n client = await client.enable({\\n commands: ['key']\\n });\\n }\\n\\n if (client !== undefined && client.key !== undefined && client.key.list !== undefined) {\\n this.getLogger().info('Processing IPNS key list...');\\n const result = await client.key.list();\\n\\n if (result === undefined || result == null || Array.isArray(result) === false) {\\n throw new Error('IPFS client returned an unknown result...');\\n }\\n\\n return result;\\n }\\n\\n throw new Error('Undefined IPNS key list...');\\n }; // Only rsa is supported yet...\\n // https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/KEY.md#keygen\\n // https://github.com/libp2p/js-libp2p-crypto/issues/145\\n\\n\\n IpfsLibrary.prototype.genKey = async function (client, ipnsName) {\\n if (client === undefined || client == null) {\\n throw new Error('Undefined IPFS provider...');\\n }\\n\\n ipnsName = ipnsName == null || ipnsName === undefined || ipnsName.trim() === '' ? null : ipnsName.trim();\\n\\n if (ipnsName == null) {\\n throw new Error('Undefined IPNS name...');\\n } // Window IPFS policy\\n\\n\\n if (client.enable) {\\n client = await client.enable({\\n commands: ['key']\\n });\\n }\\n\\n if (client !== undefined && client.key !== undefined && client.key.gen !== undefined) {\\n this.getLogger().info('Processing IPNS key gen...');\\n const key = await client.key.gen(ipnsName, {\\n type: 'rsa',\\n size: 2048\\n });\\n\\n if (key === undefined || key == null || key.id === undefined || key.id == null) {\\n throw new Error('IPFS client returned an unknown result...');\\n }\\n\\n return key.id;\\n }\\n\\n throw new Error('Undefined IPNS key gen...');\\n };\\n\\n IpfsLibrary.prototype.rmKey = async function (client, ipnsName) {\\n if (client === undefined || client == null) {\\n throw new Error('Undefined IPFS provider...');\\n }\\n\\n ipnsName = ipnsName == null || ipnsName === undefined || ipnsName.trim() === '' ? null : ipnsName.trim();\\n\\n if (ipnsName == null) {\\n throw new Error('Undefined IPNS name...');\\n } // Window IPFS policy\\n\\n\\n if (client.enable) {\\n client = await client.enable({\\n commands: ['key']\\n });\\n }\\n\\n if (client !== undefined && client.key !== undefined && client.key.rm !== undefined) {\\n this.getLogger().info('Processing IPNS key rm...');\\n const key = await client.key.rm(ipnsName);\\n\\n if (key === undefined || key == null || key.id === undefined || key.id == null) {\\n throw new Error('IPFS client returned an unknown result...');\\n }\\n\\n return key.id;\\n }\\n\\n throw new Error('Undefined IPNS key rm...');\\n };\\n\\n IpfsLibrary.prototype.renameKey = async function (client, oldIpnsName, newIpnsName) {\\n if (client === undefined || client == null) {\\n throw new Error('Undefined IPFS provider...');\\n }\\n\\n oldIpnsName = oldIpnsName == null || oldIpnsName === undefined || oldIpnsName.trim() === '' ? null : oldIpnsName.trim();\\n\\n if (oldIpnsName == null) {\\n throw new Error('Undefined Old IPNS name...');\\n }\\n\\n newIpnsName = newIpnsName == null || newIpnsName === undefined || newIpnsName.trim() === '' ? null : newIpnsName.trim();\\n\\n if (newIpnsName == null) {\\n throw new Error('Undefined New IPNS name...');\\n } // Window IPFS policy\\n\\n\\n if (client.enable) {\\n client = await client.enable({\\n commands: ['key']\\n });\\n }\\n\\n if (client !== undefined && client.key !== undefined && client.key.rename !== undefined) {\\n this.getLogger().info('Processing IPNS key rename...');\\n const key = await client.key.rename(oldIpnsName, newIpnsName);\\n\\n if (key === undefined || key == null) {\\n throw new Error('IPFS client returned an unknown result...');\\n }\\n\\n var id = null;\\n\\n if (key.id !== undefined && key.id !== null) {\\n id = key.id;\\n }\\n\\n var was = null;\\n\\n if (key.was !== undefined && key.was !== null) {\\n was = key.was;\\n }\\n\\n var now = null;\\n\\n if (key.now !== undefined && key.now !== null) {\\n now = key.now;\\n }\\n\\n var overwrite = null;\\n\\n if (key.overwrite !== undefined && key.overwrite !== null) {\\n overwrite = key.overwrite;\\n }\\n\\n return {\\n id: id,\\n was: was,\\n now: now,\\n overwrite: overwrite\\n };\\n }\\n\\n throw new Error('Undefined IPNS key rename...');\\n };\\n\\n module.exports = IpfsLibrary;\\n})();\\n\\n}).call(this,require(\\\"buffer\\\").Buffer)\\n},{\\\"@babel/runtime/helpers/asyncIterator\\\":1,\\\"@babel/runtime/helpers/interopRequireDefault\\\":2,\\\"buffer\\\":5,\\\"ipfs-provider\\\":38,\\\"window-or-global\\\":69}],73:[function(require,module,exports){\\n\\\"use strict\\\";\\n\\nvar _interopRequireDefault = require(\\\"@babel/runtime/helpers/interopRequireDefault\\\");\\n\\nvar _windowOrGlobal = _interopRequireDefault(require(\\\"window-or-global\\\"));\\n\\n(function () {\\n /*jslint node: true, browser: true */\\n 'use strict';\\n\\n const name = 'ipfs-loader';\\n const eruda = 'https://cdn.jsdelivr.net/npm/eruda@2.3.3/eruda.min.js';\\n const erudaSri = 'sha384-O4NQOgwNPEet1/xZmB7hYYb/vMdpWyVJcqL+47zpRWuXtRlhwnEoNM/w3/C3HCoP';\\n const ethers = 'https://cdn.jsdelivr.net/npm/ethers@4.0.47/dist/ethers.min.js';\\n const ethersSri = 'sha384-Gqf9kLa8S94/ZNsQCadoW0KeT6tg+fapxds7gOiSL72KeOtfgTOmHvJENrQljse5';\\n const ipfsHttpClient = 'https://cdn.jsdelivr.net/npm/ipfs-http-client@44.1.1/dist/index.min.js';\\n const ipfsHttpClientSri = 'sha384-NvfAKWfwAGQtt53C6QkNMM2whGsF9BeeXkfOWkFV3qmyh1VLVmfxxUrvLcgw0ZYr';\\n\\n var IpfsLoader = function (ipfsBundle) {\\n this.ipfsBundle = ipfsBundle;\\n };\\n\\n IpfsLoader.prototype.getLogger = function () {\\n return _windowOrGlobal.default.log.getLogger(name);\\n }; // https://www.srihash.org/\\n // https://github.com/liriliri/eruda\\n\\n\\n IpfsLoader.prototype.loadErudaLibrary = async function () {\\n if (typeof _windowOrGlobal.default.eruda === 'undefined') {\\n await this.loadLibrary('ErudaLibrary', eruda, erudaSri, true);\\n\\n if (typeof _windowOrGlobal.default.eruda !== 'undefined') {\\n this.getLogger().info(`Loaded ErudaLibrary:\\\\n ${eruda}`);\\n }\\n }\\n }; // https://www.srihash.org/\\n // https://github.com/ethers-io/ethers.js/\\n\\n\\n IpfsLoader.prototype.loadEtherJsLibrary = async function () {\\n if (typeof _windowOrGlobal.default.ethers === 'undefined') {\\n await this.loadLibrary('EtherJsLibrary', ethers, ethersSri, true);\\n\\n if (typeof _windowOrGlobal.default.ethers !== 'undefined') {\\n this.getLogger().info(`Loaded EtherJsLibrary:\\\\n ${ethers}`);\\n }\\n }\\n }; // https://www.srihash.org/\\n // https://github.com/ipfs/js-ipfs-http-client\\n\\n\\n IpfsLoader.prototype.loadIpfsHttpLibrary = async function () {\\n if (typeof _windowOrGlobal.default.IpfsHttpClient === 'undefined') {\\n await this.loadLibrary('IpfsHttpLibrary', ipfsHttpClient, ipfsHttpClientSri, true);\\n\\n if (typeof _windowOrGlobal.default.IpfsHttpClient !== 'undefined') {\\n this.getLogger().info(`Loaded IpfsHttpLibrary:\\\\n ${ipfsHttpClient}`);\\n }\\n }\\n };\\n /*eslint no-new: \\\"off\\\", no-new-func: \\\"off\\\"*/\\n\\n\\n IpfsLoader.prototype.supportDynamicImport = function () {\\n try {\\n new Function('import(\\\"\\\")');\\n return true;\\n } catch (error) {\\n return false;\\n }\\n }; // https://observablehq.com/@bryangingechen/dynamic-import-polyfill\\n\\n\\n IpfsLoader.prototype.loadLibrary = function (id, url, sri, asModule) {\\n // Dynamic import\\n // if (this.supportDynamicImport()) {\\n // try {\\n // return new Function(`return import(\\\"${url}\\\")`)();\\n // } catch (error) {\\n // // Ignore\\n // }\\n // }\\n const self = this;\\n return new Promise((resolve, reject) => {\\n // Process\\n const script = _windowOrGlobal.default.document.createElement('script'); // Functions\\n\\n\\n const cleanup = () => {\\n try {\\n delete _windowOrGlobal.default[id];\\n script.onerror = null;\\n script.onload = null;\\n script.remove();\\n URL.revokeObjectURL(script.src);\\n script.src = '';\\n } catch (error) {\\n self.getLogger().error(error);\\n }\\n };\\n\\n script.onload = () => {\\n resolve(_windowOrGlobal.default[id]);\\n cleanup();\\n };\\n\\n script.onerror = () => {\\n reject(new Error(`Failed to load: ${url}`));\\n cleanup();\\n }; // Attributes\\n\\n\\n if (asModule) {\\n script.type = 'module';\\n } else {\\n script.type = 'text/javascript';\\n }\\n\\n script.id = id;\\n script.async = false;\\n script.defer = 'defer';\\n\\n if (sri) {\\n script.integrity = sri;\\n }\\n\\n script.crossOrigin = 'anonymous'; // URL\\n\\n script.src = url; // Load\\n\\n _windowOrGlobal.default.document.head.appendChild(script);\\n });\\n };\\n\\n IpfsLoader.prototype.isJson = function (content) {\\n if (content !== undefined && content !== null && typeof content === 'string') {\\n try {\\n JSON.parse(content);\\n return true;\\n } catch (error) {// Ignore\\n }\\n }\\n\\n return false;\\n };\\n\\n IpfsLoader.prototype.httpGetToUint8Array = function (url) {\\n const self = this;\\n const xhr = new XMLHttpRequest();\\n return new Promise(function (resolve, reject) {\\n xhr.responseType = 'arraybuffer';\\n\\n xhr.onreadystatechange = function () {\\n if (xhr.readyState === 4 && xhr.status !== 0) {\\n if (xhr.status >= 300) {\\n reject(new Error($tw.language.getString('NetworkError/XMLHttpRequest')));\\n return;\\n }\\n\\n try {\\n const array = new Uint8Array(this.response);\\n self.getLogger().info(`[${xhr.status}] Loaded:\\\\n ${url}`);\\n resolve(array);\\n } catch (error) {\\n reject(error);\\n }\\n }\\n };\\n\\n xhr.onerror = function () {\\n reject(new Error($tw.language.getString('NetworkError/XMLHttpRequest')));\\n };\\n\\n try {\\n xhr.open('get', url, true);\\n xhr.send();\\n } catch (error) {\\n reject(error);\\n }\\n });\\n };\\n /*\\n * Load to Base64\\n */\\n\\n\\n IpfsLoader.prototype.loadToBase64 = async function (url) {\\n const array = await this.httpGetToUint8Array(url);\\n\\n if (array.length === 0) {\\n return {\\n data: '',\\n decrypted: false\\n };\\n } // Decrypt\\n\\n\\n if (this.isUtf8ArrayEncrypted(array)) {\\n const decrypted = await this.decryptUint8ArrayToBase64(array);\\n return {\\n data: decrypted,\\n decrypted: true\\n };\\n }\\n\\n const data = this.ipfsBundle.Uint8ArrayToBase64(array);\\n return {\\n data: data,\\n decrypted: false\\n };\\n };\\n /*\\n * Load to UTF-8\\n */\\n\\n\\n IpfsLoader.prototype.loadToUtf8 = async function (url) {\\n var array = await this.httpGetToUint8Array(url);\\n\\n if (array.length === 0) {\\n return {\\n data: '',\\n decrypted: false\\n };\\n }\\n\\n if (this.isUtf8ArrayEncrypted(array)) {\\n return {\\n data: await this.decryptUint8ArrayToUtf8(array),\\n decrypted: true\\n };\\n }\\n\\n return {\\n data: this.ipfsBundle.Utf8ArrayToStr(array),\\n decrypted: false\\n };\\n };\\n /*\\n * Decrypt Uint8 Array to Base64 String\\n */\\n\\n\\n IpfsLoader.prototype.decryptUint8ArrayToBase64 = async function (array) {\\n var data = this.ipfsBundle.Utf8ArrayToStr(array);\\n\\n if ($tw.crypto.hasPassword() === false) {\\n data = await this.decryptFromPasswordPrompt(data);\\n } else {\\n data = $tw.crypto.decrypt(data, $tw.crypto.currentPassword);\\n }\\n\\n return btoa(data);\\n };\\n /*\\n * Decrypt Uint8 Array to UTF-8 String\\n */\\n\\n\\n IpfsLoader.prototype.decryptUint8ArrayToUtf8 = async function (array) {\\n var data = this.ipfsBundle.Utf8ArrayToStr(array);\\n\\n if ($tw.crypto.hasPassword() === false) {\\n data = await this.decryptFromPasswordPrompt(data);\\n } else {\\n data = $tw.crypto.decrypt(data, $tw.crypto.currentPassword);\\n }\\n\\n return data;\\n };\\n\\n IpfsLoader.prototype.decryptFromPasswordPrompt = function (encrypted) {\\n return new Promise((resolve, reject) => {\\n $tw.passwordPrompt.createPrompt({\\n serviceName: 'Enter a password to decrypt the imported content!!',\\n noUserName: true,\\n canCancel: true,\\n submitText: 'Decrypt',\\n callback: function (data) {\\n if (!data) {\\n return false;\\n } // Decrypt\\n\\n\\n try {\\n const content = $tw.crypto.decrypt(encrypted, data.password);\\n resolve(content);\\n return true;\\n } catch (error) {\\n reject(error);\\n }\\n\\n return false;\\n }\\n });\\n });\\n };\\n\\n IpfsLoader.prototype.isUtf8ArrayEncrypted = function (content) {\\n // Check\\n if (content instanceof Uint8Array === false || content.length === 0) {\\n return false;\\n } // Process\\n\\n\\n const standford = this.ipfsBundle.StringToUint8Array('{\\\"iv\\\":\\\"');\\n var encrypted = false;\\n\\n for (var i = 0; i \u003C content.length && i \u003C standford.length; i++) {\\n if (content[i] === standford[i]) {\\n encrypted = true;\\n } else {\\n encrypted = false;\\n break;\\n }\\n }\\n\\n return encrypted;\\n };\\n\\n module.exports = IpfsLoader;\\n})();\\n\\n},{\\\"@babel/runtime/helpers/interopRequireDefault\\\":2,\\\"window-or-global\\\":69}],74:[function(require,module,exports){\\n\\\"use strict\\\";\\n\\nvar _interopRequireDefault = require(\\\"@babel/runtime/helpers/interopRequireDefault\\\");\\n\\nvar _windowOrGlobal = _interopRequireDefault(require(\\\"window-or-global\\\"));\\n\\nvar _universalUrl = require(\\\"universal-url\\\");\\n\\n(function () {\\n /*jslint node: true, browser: true */\\n 'use strict';\\n\\n const name = 'ipfs-url';\\n\\n var IpfsUrl = function () {};\\n\\n IpfsUrl.prototype.getLogger = function () {\\n return _windowOrGlobal.default.log.getLogger(name);\\n };\\n\\n IpfsUrl.prototype.getIpfsDefaultApiUrl = function () {\\n return new _universalUrl.URL(this.getIpfsDefaultApi());\\n };\\n\\n IpfsUrl.prototype.getIpfsDefaultGatewayUrl = function () {\\n return new _universalUrl.URL(this.getIpfsDefaultGateway());\\n };\\n\\n IpfsUrl.prototype.getIpfsApiUrl = function () {\\n try {\\n return this.getUrl($tw.utils.getIpfsSaverApiUrl());\\n } catch (error) {\\n return this.getIpfsDefaultApiUrl();\\n }\\n };\\n\\n IpfsUrl.prototype.getIpfsGatewayUrl = function () {\\n try {\\n return this.getUrl($tw.utils.getIpfsSaverGatewayUrl());\\n } catch (error) {\\n return this.getIpfsDefaultGatewayUrl();\\n }\\n };\\n\\n IpfsUrl.prototype.getIpfsDefaultApi = function () {\\n return 'https://tube.copylaradio.com:5001';\\n };\\n\\n IpfsUrl.prototype.getIpfsDefaultGateway = function () {\\n return 'https://tube.copylaradio.com';\\n };\\n /**\\n * url.href;\\n * url.origin\\n * url.protocol;\\n * url.username;\\n * url.password;\\n * url.host;\\n * url.hostname;\\n * url.port;\\n * url.pathname;\\n * url.search;\\n * url.hash;\\n * https://jsdom.github.io/whatwg-url/\\n * https://github.com/stevenvachon/universal-url\\n * https://github.com/stevenvachon/universal-url-lite\\n * https://url.spec.whatwg.org/\\n */\\n\\n\\n IpfsUrl.prototype.getDocumentUrl = function () {\\n try {\\n return new _universalUrl.URL(_windowOrGlobal.default.location.href);\\n } catch (error) {\\n this.getLogger().error(error);\\n }\\n\\n throw new Error('Invalid current HTML Document URL...');\\n };\\n\\n IpfsUrl.prototype.getUrl = function (url, base) {\\n try {\\n return new _universalUrl.URL(url, base);\\n } catch (error) {// Ignore\\n }\\n\\n throw new Error('Invalid URL...');\\n };\\n\\n IpfsUrl.prototype.getIpfsBaseUrl = function () {\\n var base = this.getIpfsGatewayUrl();\\n\\n try {\\n if ($tw.utils.getIpfsUrlPolicy() === 'origin') {\\n base = this.getDocumentUrl();\\n\\n if (base.protocol === 'file:') {\\n return this.getUrl(base.toString());\\n }\\n }\\n } catch (error) {\\n base = this.getIpfsGatewayUrl();\\n }\\n\\n return this.getUrl(`${base.protocol}//${base.host}`);\\n };\\n\\n IpfsUrl.prototype.normalizeUrl = function (value, base) {\\n value = value === undefined || value == null || value.toString().trim() === '' ? null : value.toString().trim();\\n\\n if (value == null) {\\n return null;\\n } // Parse\\n\\n\\n var text = false;\\n var url = null; // Text or ENS\\n\\n try {\\n url = this.getUrl(value);\\n } catch (error) {\\n if (value.startsWith('/') === false && value.startsWith('./') === false && value.startsWith('../') === false) {\\n text = true;\\n\\n try {\\n url = this.getUrl(`https://${value}`);\\n\\n if (url.hostname.endsWith('.eth') === false && url.hostname.endsWith('.eth.link') === false) {\\n url = null;\\n } else {\\n text = false;\\n }\\n } catch (error) {// ignore\\n }\\n }\\n }\\n\\n if (text) {\\n return null;\\n } // Invalid URL, try to parse with a Base URL\\n\\n\\n if (url == null) {\\n url = this.getUrl(value, base !== undefined && base !== null ? base : this.getIpfsBaseUrl());\\n } // Remove .link from .eth.link\\n\\n\\n if (url.hostname.endsWith('.eth.link')) {\\n url.hostname = url.hostname.substring(0, url.hostname.indexOf('.link'));\\n }\\n\\n return url;\\n };\\n\\n module.exports = IpfsUrl;\\n})();\\n\\n},{\\\"@babel/runtime/helpers/interopRequireDefault\\\":2,\\\"universal-url\\\":64,\\\"window-or-global\\\":69}]},{},[71])(71)\\n});\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"library\"\n },\n \"$:/plugins/ipfs/ipfs-controller.js\": {\n \"title\": \"$:/plugins/ipfs/ipfs-controller.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/ipfs-controller.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: library\\n\\nIPFS Controller\\n\\n\\\\*/\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n const EnsWrapper = require('$:/plugins/ipfs/ens-wrapper.js').EnsWrapper\\n const IpfsBundle = require('$:/plugins/ipfs/ipfs-bundle.js').IpfsBundle\\n const IpfsWrapper = require('$:/plugins/ipfs/ipfs-wrapper.js').IpfsWrapper\\n\\n const ipfsKeyword = 'ipfs'\\n const ipnsKeyword = 'ipns'\\n\\n const name = 'ipfs-controller'\\n\\n var IpfsController = function () {\\n this.ipfsBundle = new IpfsBundle()\\n this.ipfsBundle.init()\\n this.ensWrapper = new EnsWrapper(this.ipfsBundle)\\n this.ipfsUrl = this.ipfsBundle.ipfsUrl\\n this.ipfsWrapper = new IpfsWrapper(this.ipfsBundle)\\n this.ipfsClients = new Map()\\n this.pin = []\\n this.unpin = []\\n }\\n\\n IpfsController.prototype.getLogger = function () {\\n return window.log.getLogger(name)\\n }\\n\\n IpfsController.prototype.isCid = function (cid) {\\n return this.ipfsBundle.isCid(cid)\\n }\\n\\n IpfsController.prototype.loadToBase64 = async function (url) {\\n return this.ipfsBundle.loadToBase64(url)\\n }\\n\\n IpfsController.prototype.loadToUtf8 = async function (url) {\\n return this.ipfsBundle.loadToUtf8(url)\\n }\\n\\n IpfsController.prototype.Base64ToUint8Array = function (base64) {\\n return this.ipfsBundle.Base64ToUint8Array(base64)\\n }\\n\\n IpfsController.prototype.Uint8ArrayToBase64 = function (uint8) {\\n return this.ipfsBundle.Uint8ArrayToBase64(uint8)\\n }\\n\\n IpfsController.prototype.StringToUint8Array = function (string) {\\n return this.ipfsBundle.StringToUint8Array(string)\\n }\\n\\n IpfsController.prototype.Utf8ArrayToStr = function (array) {\\n return this.ipfsBundle.Utf8ArrayToStr(array)\\n }\\n\\n IpfsController.prototype.requestToPin = function (cid, ipnsKey, value) {\\n const self = this\\n return new Promise((resolve, reject) => {\\n if (ipnsKey !== undefined && ipnsKey !== null) {\\n self\\n .resolveUrl(true, true, value)\\n .then(data => {\\n const { cid, resolvedUrl } = data\\n if (resolvedUrl !== null && cid !== null) {\\n resolve(self.addToPin(cid, resolvedUrl))\\n } else {\\n resolve(false)\\n }\\n })\\n .catch(error => {\\n reject(error)\\n })\\n } else if (cid !== undefined && cid !== null) {\\n const normalizedUrl = self.normalizeUrl(`/${ipfsKeyword}/${cid}`)\\n resolve(self.addToPin(cid, normalizedUrl))\\n } else {\\n resolve(false)\\n }\\n })\\n }\\n\\n IpfsController.prototype.addToPin = function (cid, normalizedUrl) {\\n if (cid !== undefined && cid !== null) {\\n var index = this.unpin.indexOf(cid)\\n if (index !== -1) {\\n this.unpin.splice(index, 1)\\n this.getLogger().info(`Cancel request to Unpin:\\\\n ${normalizedUrl}`)\\n return false\\n }\\n if (this.pin.indexOf(cid) === -1) {\\n this.pin.push(cid)\\n this.getLogger().info(`Request to Pin:\\\\n ${normalizedUrl}`)\\n return true\\n }\\n }\\n return false\\n }\\n\\n IpfsController.prototype.requestToUnpin = function (cid, ipnsKey, value) {\\n const self = this\\n return new Promise((resolve, reject) => {\\n if ($tw.utils.getIpfsUnpin() === false) {\\n resolve(false)\\n }\\n if (ipnsKey !== undefined && ipnsKey !== null) {\\n self\\n .resolveUrl(true, true, value)\\n .then(data => {\\n const { cid, resolvedUrl } = data\\n if (resolvedUrl !== null && cid !== null) {\\n resolve(self.addToUnpin(cid, resolvedUrl))\\n } else {\\n resolve(false)\\n }\\n })\\n .catch(error => {\\n reject(error)\\n })\\n } else if (cid !== undefined && cid !== null) {\\n const normalizedUrl = self.normalizeUrl(`/${ipfsKeyword}/${cid}`)\\n resolve(self.addToUnpin(cid, normalizedUrl))\\n } else {\\n resolve(false)\\n }\\n })\\n }\\n\\n IpfsController.prototype.addToUnpin = function (cid, normalizedUrl) {\\n if (cid !== undefined && cid !== null) {\\n // Discard\\n var index = this.pin.indexOf(cid)\\n if (index !== -1) {\\n this.pin.splice(index, 1)\\n this.getLogger().info(`Cancel request to Pin:\\\\n ${normalizedUrl}`)\\n return false\\n }\\n // Add to unpin\\n if (this.unpin.indexOf(cid) === -1) {\\n this.unpin.push(cid)\\n this.getLogger().info(`Request to unpin:\\\\n ${normalizedUrl}`)\\n return true\\n }\\n }\\n return false\\n }\\n\\n IpfsController.prototype.removeFromPinUnpin = function (cid, normalizedUrl) {\\n if (cid !== undefined && cid !== null) {\\n var index = this.pin.indexOf(cid)\\n if (index !== -1) {\\n this.pin.splice(index, 1)\\n this.getLogger().info(`Cancel request to Pin:\\\\n ${normalizedUrl}`)\\n }\\n var index = this.unpin.indexOf(cid)\\n if (index !== -1) {\\n this.unpin.splice(index, 1)\\n this.getLogger().info(`Cancel request to Unpin:\\\\n ${normalizedUrl}`)\\n }\\n }\\n }\\n\\n IpfsController.prototype.pinToIpfs = async function (cid) {\\n const { ipfs } = await this.getIpfsClient()\\n return await this.ipfsWrapper.pinToIpfs(ipfs, cid)\\n }\\n\\n IpfsController.prototype.unpinFromIpfs = async function (cid) {\\n const { ipfs } = await this.getIpfsClient()\\n return await this.ipfsWrapper.unpinFromIpfs(ipfs, cid)\\n }\\n\\n IpfsController.prototype.addToIpfs = async function (content) {\\n const { ipfs } = await this.getIpfsClient()\\n return await this.ipfsWrapper.addToIpfs(ipfs, content)\\n }\\n\\n IpfsController.prototype.generateIpnsKey = async function (ipnsName) {\\n const { ipfs } = await this.getIpfsClient()\\n return await this.ipfsWrapper.generateIpnsKey(ipfs, ipnsName)\\n }\\n\\n IpfsController.prototype.removeIpnsKey = async function (ipnsName) {\\n const { ipfs } = await this.getIpfsClient()\\n return await this.ipfsWrapper.removeIpnsKey(ipfs, ipnsName)\\n }\\n\\n IpfsController.prototype.renameIpnsName = async function (\\n oldIpnsName,\\n newIpnsName\\n ) {\\n const { ipfs } = await this.getIpfsClient()\\n return await this.ipfsWrapper.renameIpnsName(ipfs, oldIpnsName, newIpnsName)\\n }\\n\\n IpfsController.prototype.decodeCid = function (pathname) {\\n return this.ipfsBundle.decodeCid(pathname)\\n }\\n\\n IpfsController.prototype.getIpnsIdentifiers = async function (\\n identifier,\\n ipnsName\\n ) {\\n const { ipfs } = await this.getIpfsClient()\\n return await this.ipfsWrapper.getIpnsIdentifiers(ipfs, identifier, ipnsName)\\n }\\n\\n IpfsController.prototype.resolveIpnsKey = async function (ipnsKey) {\\n const { ipfs } = await this.getIpfsClient()\\n return await this.ipfsWrapper.resolveIpnsKey(ipfs, ipnsKey)\\n }\\n\\n IpfsController.prototype.publishIpnsName = async function (\\n cid,\\n ipnsKey,\\n ipnsName\\n ) {\\n const { ipfs } = await this.getIpfsClient()\\n return await this.ipfsWrapper.publishIpnsName(cid, ipfs, ipnsKey, ipnsName)\\n }\\n\\n IpfsController.prototype.getIpfsBaseUrl = function () {\\n return this.ipfsUrl.getIpfsBaseUrl()\\n }\\n\\n IpfsController.prototype.normalizeUrl = function (value, base) {\\n return this.ipfsUrl.normalizeUrl(value, base)\\n }\\n\\n IpfsController.prototype.getDocumentUrl = function () {\\n return this.ipfsUrl.getDocumentUrl()\\n }\\n\\n IpfsController.prototype.getIpfsDefaultApi = function () {\\n return this.ipfsUrl.getIpfsDefaultApi()\\n }\\n\\n IpfsController.prototype.getIpfsDefaultGateway = function () {\\n return this.ipfsUrl.getIpfsDefaultGateway()\\n }\\n\\n IpfsController.prototype.getIpfsApiUrl = function () {\\n return this.ipfsUrl.getIpfsApiUrl()\\n }\\n\\n IpfsController.prototype.getIpfsGatewayUrl = function () {\\n return this.ipfsUrl.getIpfsGatewayUrl()\\n }\\n\\n IpfsController.prototype.resolveUrl = async function (\\n resolveIpns,\\n resolveEns,\\n value,\\n base\\n ) {\\n var cid = null\\n var ipnsKey = null\\n var ipnsName = null\\n var normalizedUrl = null\\n var resolvedUrl = null\\n value =\\n value === undefined || value == null || value.toString().trim() === ''\\n ? null\\n : value.toString().trim()\\n if (value == null) {\\n return {\\n cid: null,\\n ipnsKey: null,\\n ipnsName: null,\\n normalizedUrl: null,\\n resolvedUrl: null\\n }\\n }\\n try {\\n normalizedUrl = this.normalizeUrl(value, base)\\n } catch (error) {\\n // Ignore\\n }\\n if (normalizedUrl == null) {\\n return {\\n cid: null,\\n ipnsKey: null,\\n ipnsName: null,\\n normalizedUrl: null,\\n resolvedUrl: null\\n }\\n }\\n var { cid, ipnsIdentifier, protocol } = this.decodeCid(\\n normalizedUrl.pathname\\n )\\n if (\\n protocol !== null &&\\n protocol === ipnsKeyword &&\\n ipnsIdentifier !== null\\n ) {\\n var { ipnsKey, ipnsName, normalizedUrl } = await this.getIpnsIdentifiers(\\n ipnsIdentifier\\n )\\n if (resolveIpns) {\\n this.getLogger().info(`Resolving IPNS key:\\\\n ${normalizedUrl}`)\\n $tw.utils.alert(name, 'Resolving an IPNS key...')\\n try {\\n cid = await this.resolveIpnsKey(ipnsKey)\\n if (cid !== null) {\\n resolvedUrl = this.normalizeUrl(`/${ipfsKeyword}/${cid}`, base)\\n this.getLogger().info(\\n `Successfully resolved IPNS key:\\\\n ${normalizedUrl}`\\n )\\n $tw.utils.alert(name, 'Successfully resolved an IPNS key...')\\n }\\n } catch (error) {\\n // Unable to resolve the key\\n // It usually happen when the key is not initialized\\n cid = null\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n }\\n }\\n } else if (resolveEns && normalizedUrl.hostname.endsWith('.eth')) {\\n var { content: cid, resolvedUrl } = await this.resolveEns(\\n normalizedUrl.hostname\\n )\\n } else {\\n resolvedUrl = normalizedUrl\\n }\\n return {\\n cid: cid,\\n ipnsKey: ipnsKey,\\n ipnsName: ipnsName,\\n normalizedUrl: normalizedUrl,\\n resolvedUrl: resolvedUrl\\n }\\n }\\n\\n IpfsController.prototype.getUrl = function (url, base) {\\n return this.ipfsUrl.getUrl(\\n url,\\n base !== undefined && base !== null ? base : this.getIpfsBaseUrl()\\n )\\n }\\n\\n IpfsController.prototype.isJson = function (content) {\\n return this.ipfsBundle.isJson(content)\\n }\\n\\n IpfsController.prototype.getIpfsClient = async function () {\\n // Provider\\n const ipfsProvider = $tw.utils.getIpfsProvider()\\n // IPFS companion\\n if (ipfsProvider === 'window') {\\n const client = await this.ipfsWrapper.getWindowIpfsClient()\\n return {\\n ipfs: client.ipfs,\\n provider: client.provider\\n }\\n }\\n // Default, try IPFS companion\\n if (ipfsProvider === 'default') {\\n try {\\n const client = await this.ipfsWrapper.getWindowIpfsClient()\\n return {\\n ipfs: client.ipfs,\\n provider: client.provider\\n }\\n } catch (error) {\\n // Ignore, fallback to HTTP\\n }\\n }\\n // Current API URL\\n const url = this.getIpfsApiUrl()\\n // Check\\n if (url === undefined || url == null || url.toString().trim() === '') {\\n throw new Error('Undefined IPFS API URL...')\\n }\\n // HTTP Client\\n const client = this.ipfsClients.get(url.toString())\\n if (client !== undefined) {\\n // Log\\n this.getLogger().info(`Reuse IPFS provider: \\\"${client.provider}\\\"`)\\n // Done\\n return {\\n ipfs: client.ipfs,\\n provider: client.provider\\n }\\n }\\n // Build a new HTTP client\\n const policy = await this.ipfsWrapper.getHttpIpfsClient(url)\\n const ipfs = policy.ipfs\\n const provider = policy.provider\\n // Store\\n this.ipfsClients.set(url.toString(), { ipfs, provider })\\n // Log\\n this.getLogger().info(`New IPFS provider: \\\"${policy.provider}\\\"`)\\n // Done\\n return {\\n ipfs: ipfs,\\n provider: provider\\n }\\n }\\n\\n IpfsController.prototype.resolveEns = async function (ensDomain) {\\n const { web3 } = await this.getWeb3Provider()\\n const { content, protocol } = await this.ensWrapper.getContentHash(\\n ensDomain,\\n web3\\n )\\n if (content !== null && protocol !== null) {\\n const url = this.normalizeUrl(`/${protocol}/${content}`)\\n this.getLogger().info(\\n `Successfully fetched ENS domain content: \\\"${ensDomain}\\\"\\\\n ${url}`\\n )\\n return {\\n content: content,\\n protocol: protocol,\\n resolvedUrl: url\\n }\\n }\\n return {\\n content: null,\\n protocol: null,\\n resolvedUrl: null\\n }\\n }\\n\\n IpfsController.prototype.setEns = async function (ensDomain, cid) {\\n const { web3, account } = await this.getEnabledWeb3Provider()\\n const { cidV0 } = await this.ensWrapper.setContentHash(\\n ensDomain,\\n cid,\\n web3,\\n account\\n )\\n if (cidV0 !== null) {\\n const url = this.normalizeUrl(`/ipfs/${cidV0}`)\\n this.getLogger().info(\\n `Successfully set ENS domain content:\\\\n ${url} \\\\n to: \\\"${ensDomain}\\\"`\\n )\\n return true\\n }\\n return false\\n }\\n\\n IpfsController.prototype.getEthereumProvider = async function () {\\n return await this.ensWrapper.getEthereumProvider()\\n }\\n\\n IpfsController.prototype.getEnabledWeb3Provider = async function () {\\n return await this.ensWrapper.getEnabledWeb3Provider()\\n }\\n\\n IpfsController.prototype.getWeb3Provider = async function () {\\n return await this.ensWrapper.getWeb3Provider()\\n }\\n\\n IpfsController.prototype.getChainId = function () {\\n return this.ensWrapper.getChainId()\\n }\\n\\n exports.IpfsController = IpfsController\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"library\"\n },\n \"$:/plugins/ipfs/ipfs-default.js\": {\n \"title\": \"$:/plugins/ipfs/ipfs-default.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/ipfs-default.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: utils\\n\\nIPFS Default\\n\\n\\\\*/\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n /*\\n * Retrieve ipfs saver export protocol with default value if applicable\\n */\\n exports.getIpfsExport = function () {\\n var output = null\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/export')\\n if (tiddler !== undefined && tiddler !== null) {\\n var text = tiddler.getFieldString('text')\\n text =\\n text === undefined || text == null || text.trim() === ''\\n ? null\\n : text.trim()\\n if (text !== null) {\\n output = text\\n }\\n }\\n if (output == null) {\\n output = $tw.utils.getIpfsDefaultExport()\\n }\\n return output\\n }\\n\\n /*\\n * Default Export\\n */\\n exports.getIpfsDefaultExport = function () {\\n return 'json'\\n }\\n\\n /*\\n * Retrieve ipfs saver protocol with default value if applicable\\n */\\n exports.getIpfsProtocol = function () {\\n var protocol = null\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/protocol')\\n if (tiddler !== undefined && tiddler !== null) {\\n var text = tiddler.getFieldString('text')\\n text =\\n text === undefined || text == null || text.trim() === ''\\n ? null\\n : text.trim()\\n if (text !== null) {\\n protocol = text\\n }\\n }\\n if (protocol == null) {\\n protocol = $tw.utils.getIpfsDefaultProtocol()\\n }\\n return protocol\\n }\\n\\n /*\\n * Default Protocol\\n */\\n exports.getIpfsDefaultProtocol = function () {\\n return 'ipfs'\\n }\\n\\n /*\\n * Retrieve ipfs saver api url with default value if applicable\\n */\\n exports.getIpfsSaverApiUrl = function () {\\n var api = null\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/api')\\n if (tiddler !== undefined && tiddler !== null) {\\n var text = tiddler.getFieldString('text')\\n text =\\n text === undefined || text == null || text.trim() === ''\\n ? null\\n : text.trim()\\n if (text !== null) {\\n api = text\\n }\\n }\\n if (api !== null) {\\n tiddler = $tw.wiki.getTiddler(api)\\n if (tiddler !== undefined && tiddler !== null) {\\n var text = tiddler.getFieldString('text')\\n text =\\n text === undefined || text == null || text.trim() === ''\\n ? null\\n : text.trim()\\n if (text !== null) {\\n api = text\\n }\\n }\\n }\\n if (api == null) {\\n api = $tw.ipfs.getIpfsDefaultApi()\\n }\\n return api\\n }\\n\\n /*\\n * Retrieve ipfs saver gateway url with default value if applicable\\n */\\n exports.getIpfsSaverGatewayUrl = function () {\\n var gateway = null\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/gateway')\\n if (tiddler !== undefined && tiddler !== null) {\\n var text = tiddler.getFieldString('text')\\n text =\\n text === undefined || text == null || text.trim() === ''\\n ? null\\n : text.trim()\\n if (text !== null) {\\n gateway = text\\n }\\n }\\n if (gateway !== null) {\\n tiddler = $tw.wiki.getTiddler(gateway)\\n if (tiddler !== undefined && tiddler !== null) {\\n var text = tiddler.getFieldString('text')\\n text =\\n text === undefined || text == null || text.trim() === ''\\n ? null\\n : text.trim()\\n if (text !== null) {\\n gateway = text\\n }\\n }\\n }\\n if (gateway == null) {\\n gateway = $tw.ipfs.getIpfsDefaultGateway()\\n }\\n return gateway\\n }\\n\\n /*\\n * Retrieve ipfs saver ens domain with default value if applicable\\n */\\n exports.getIpfsEnsDomain = function () {\\n var ensDomain = null\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/ens/domain')\\n if (tiddler !== undefined && tiddler !== null) {\\n var text = tiddler.getFieldString('text')\\n text =\\n text === undefined || text == null || text.trim() === ''\\n ? null\\n : text.trim()\\n if (text !== null) {\\n ensDomain = text\\n }\\n }\\n return ensDomain\\n }\\n\\n /*\\n * Retrieve ipfs saver ipns name with default value if applicable\\n */\\n exports.getIpfsIpnsName = function () {\\n var ipnsName = null\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/ipns/name')\\n if (tiddler !== undefined && tiddler !== null) {\\n var text = tiddler.getFieldString('text')\\n text =\\n text === undefined || text == null || text.trim() === ''\\n ? null\\n : text.trim()\\n if (text !== null) {\\n ipnsName = text\\n }\\n }\\n return ipnsName\\n }\\n\\n /*\\n * Retrieve ipfs saver ipns key with default value if applicable\\n */\\n exports.getIpfsIpnsKey = function () {\\n var ipnsKey = null\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/ipns/key')\\n if (tiddler !== undefined && tiddler !== null) {\\n var text = tiddler.getFieldString('text')\\n text =\\n text === undefined || text == null || text.trim() === ''\\n ? null\\n : text.trim()\\n if (text !== null) {\\n ipnsKey = text\\n }\\n }\\n return ipnsKey\\n }\\n\\n /*\\n * Retrieve ipfs saver verbose with default value if applicable\\n */\\n exports.getIpfsVerbose = function () {\\n var verbose = null\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/verbose')\\n if (tiddler !== undefined && tiddler !== null) {\\n var text = tiddler.getFieldString('text')\\n text =\\n text === undefined || text == null || text.trim() === ''\\n ? null\\n : text.trim()\\n if (text !== null) {\\n verbose = text\\n }\\n }\\n if (verbose == null) {\\n verbose = true // default, see ipfs-saver.tid\\n } else {\\n verbose = verbose === 'yes'\\n }\\n return verbose\\n }\\n\\n /*\\n * Retrieve ipfs saver unpin with default value if applicable\\n */\\n exports.getIpfsUnpin = function () {\\n var unpin = null\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/unpin')\\n if (tiddler !== undefined && tiddler !== null) {\\n var text = tiddler.getFieldString('text')\\n text =\\n text === undefined || text == null || text.trim() === ''\\n ? null\\n : text.trim()\\n if (text !== null) {\\n unpin = text\\n }\\n }\\n if (unpin == null) {\\n unpin = false // default, see ipfs-saver.tid\\n } else {\\n unpin = unpin === 'yes'\\n }\\n return unpin\\n }\\n\\n /*\\n * Retrieve ipfs saver url policy with default value if applicable\\n */\\n exports.getIpfsUrlPolicy = function () {\\n var policy = null\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/policy')\\n if (tiddler !== undefined && tiddler !== null) {\\n var text = tiddler.getFieldString('text')\\n text =\\n text === undefined || text == null || text.trim() === ''\\n ? null\\n : text.trim()\\n if (text !== null) {\\n policy = text\\n }\\n }\\n if (policy == null) {\\n policy = $tw.utils.getIpfsDefaultPolicy()\\n }\\n return policy\\n }\\n\\n /*\\n * Default Policy\\n */\\n exports.getIpfsDefaultPolicy = function () {\\n return 'gateway'\\n }\\n\\n /*\\n * Retrieve ipfs saver provider with default value if applicable\\n */\\n exports.getIpfsProvider = function () {\\n var provider = null\\n var tiddler = $tw.wiki.getTiddler('$:/ipfs/saver/provider')\\n if (tiddler !== undefined && tiddler !== null) {\\n var text = tiddler.getFieldString('text')\\n text =\\n text === undefined || text == null || text.trim() === ''\\n ? null\\n : text.trim()\\n if (text !== null) {\\n provider = text\\n }\\n }\\n if (provider == null) {\\n provider = $tw.utils.getIpfsDefaultProvider()\\n }\\n return provider\\n }\\n\\n /*\\n * Default Provider\\n */\\n exports.getIpfsDefaultProvider = function () {\\n return 'http'\\n }\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"utils\"\n },\n \"$:/plugins/ipfs/ipfs-import.js\": {\n \"title\": \"$:/plugins/ipfs/ipfs-import.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/ipfs-import.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: library\\n\\nIPFS Import\\n\\n\\\\*/\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n const name = 'ipfs-import'\\n\\n const local = '\u003Ca href=\\\"'\\n const remote = '\u003Ca rel=\\\"noopener noreferrer\\\" target=\\\"_blank\\\" href=\\\"'\\n\\n const alertFailed = function (\\n strings,\\n msg,\\n key,\\n field,\\n parentField,\\n parentUrl,\\n parentTitle\\n ) {\\n var space = strings[1]\\n var endH1 = strings[2]\\n var endL1 = strings[3]\\n var from = strings[4]\\n var endH2 = strings[5]\\n var endL2 = strings[6]\\n if (\\n parentUrl.hostname === $tw.ipfs.getIpfsBaseUrl().hostname &&\\n parentUrl.pathname === $tw.ipfs.getIpfsBaseUrl().pathname\\n ) {\\n return `${msg}${space}${remote}${key}${endH1}${field}${endL1}${parentField}${from}${local}${parentUrl}${endH2}${parentTitle}${endL2}`\\n } else {\\n return `${msg}${space}${remote}${key}${endH1}${field}${endL1}${parentField}${from}${remote}${parentUrl}${endH2}${parentTitle}${endL2}`\\n }\\n }\\n\\n const alertFieldFailed = function (strings, msg, field, url, title) {\\n var failed = strings[1]\\n var from = strings[2]\\n var endH = strings[3]\\n var endL = strings[4]\\n if (\\n url.hostname === $tw.ipfs.getIpfsBaseUrl().hostname &&\\n url.pathname === $tw.ipfs.getIpfsBaseUrl().pathname\\n ) {\\n return `${msg}${failed}${field}${from}${local}${url}${endH}${title}${endL}`\\n } else {\\n return `${msg}${failed}${field}${from}${remote}${url}${endH}${title}${endL}`\\n }\\n }\\n\\n const alertConditionFailed = function (\\n strings,\\n msg,\\n condition,\\n key,\\n title,\\n parentUrl\\n ) {\\n var space = strings[1]\\n var from = strings[2]\\n var endH1 = strings[3]\\n var endL1 = strings[4]\\n var endH2 = strings[5]\\n var endL2 = strings[6]\\n if (\\n parentUrl.hostname === $tw.ipfs.getIpfsBaseUrl().hostname &&\\n parentUrl.pathname === $tw.ipfs.getIpfsBaseUrl().pathname\\n ) {\\n return `${msg}${space}${condition}${from}${remote}${key}${endH1}${title}${endL1}${local}${parentUrl}${endH2}${title}${endL2}`\\n } else {\\n return `${msg}${space}${condition}${from}${remote}${key}${endH1}${title}${endL1}${remote}${parentUrl}${endH2}${title}${endL2}`\\n }\\n }\\n\\n var IpfsImport = function () {}\\n\\n IpfsImport.prototype.getLogger = function () {\\n return window.log.getLogger(name)\\n }\\n\\n IpfsImport.prototype.removeTiddlers = function (keys, title) {\\n var removed = 0\\n for (var key of this.loaded.keys()) {\\n if (keys.indexOf(key) !== -1) {\\n continue\\n }\\n const { imported, resolvedKey } = this.loaded.get(key)\\n if (imported.delete(title)) {\\n const msg = 'Remove:'\\n const field = ''\\n this.getLogger().info(`${msg} ${field}\\\"${title}\\\"\\\\n ${resolvedKey}`)\\n $tw.utils.alert(\\n name,\\n alertFieldFailed`${msg} ${field}${resolvedKey}\\\">${title}\u003C/a>`\\n )\\n removed += 1\\n }\\n }\\n return removed\\n }\\n\\n IpfsImport.prototype.getKey = async function (base, value) {\\n var cid = null\\n var ipnsKey = null\\n var key = null\\n var normalizedUrl = null\\n var resolvedUrl = null\\n value =\\n value === undefined || value == null || value.trim() === ''\\n ? null\\n : value.trim()\\n if (value == null) {\\n return {\\n key: null,\\n isIpfs: false,\\n resolvedUrl: null\\n }\\n }\\n var {\\n cid,\\n ipnsKey,\\n normalizedUrl,\\n resolvedUrl\\n } = await $tw.ipfs.resolveUrl(false, true, value, base)\\n if (normalizedUrl == null && resolvedUrl == null) {\\n throw new Error(`Failed to resolve value: \\\"${value}\\\"`)\\n }\\n if (cid !== null) {\\n key = `/ipfs/${cid}`\\n } else if (ipnsKey !== null) {\\n key = `/ipns/${ipnsKey}`\\n } else if (normalizedUrl.hostname.endsWith('.eth')) {\\n key = normalizedUrl.hostname\\n } else {\\n key = normalizedUrl.toString()\\n }\\n return {\\n key: key,\\n resolvedUrl: resolvedUrl\\n }\\n }\\n\\n IpfsImport.prototype.isIpfs = async function (key) {\\n key =\\n key === undefined || key == null || key.trim() === '' ? null : key.trim()\\n if (key == null) {\\n return false\\n }\\n const { cid, ipnsIdentifier } = $tw.ipfs.decodeCid(key)\\n if (cid !== null || ipnsIdentifier !== null) {\\n return true\\n } else if (key.endsWith('.eth')) {\\n return true\\n }\\n return false\\n }\\n\\n IpfsImport.prototype.import = async function (\\n canonicalUri,\\n importUri,\\n tiddler\\n ) {\\n const self = this\\n var loadedAdded = 0\\n var loadedRemoved = 0\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n importUri =\\n importUri === undefined || importUri == null || importUri.trim() === ''\\n ? null\\n : importUri.trim()\\n this.host = tiddler\\n const { type, info } = $tw.utils.getContentType(\\n tiddler.fields.title,\\n tiddler.fields.type\\n )\\n this.loaded = new Map()\\n this.notLoaded = []\\n this.isEmpty = []\\n this.resolved = new Map()\\n this.notResolved = []\\n this.added = []\\n this.updated = []\\n this.merged = new Map()\\n try {\\n // Load and prepare imported tiddlers to be processed\\n const url = $tw.ipfs.getIpfsBaseUrl()\\n url.hash = tiddler.fields.title\\n if (canonicalUri !== null || importUri !== null) {\\n this.getLogger().info('*** Begin Import ***')\\n this.rootUri = importUri !== null ? importUri : canonicalUri\\n if (this.rootUri !== null) {\\n const {\\n loaded: importLoaded,\\n removed: importRemoved\\n } = await this.load(\\n url,\\n tiddler.fields.title,\\n '_import_uri',\\n importUri,\\n true\\n )\\n loadedAdded += importLoaded\\n loadedRemoved += importRemoved\\n }\\n if (canonicalUri !== null) {\\n var load = true\\n if (info.encoding === 'base64' || type === 'image/svg+xml') {\\n load = false\\n }\\n const {\\n loaded: canonicalLoaded,\\n removed: canonicalRemoved\\n } = await this.load(\\n url,\\n tiddler.fields.title,\\n '_canonical_uri',\\n canonicalUri,\\n load\\n )\\n loadedAdded += canonicalLoaded\\n loadedRemoved += canonicalRemoved\\n }\\n const { processed, removed: processedRemoved } = this.processImported()\\n this.importTiddlers()\\n this.getLogger().info(`*** Loaded: ${this.loaded.size} Resource(s) ***`)\\n this.getLogger().info(\\n `*** Loaded: ${this.isEmpty.length} Empty Resource(s) ***`\\n )\\n this.getLogger().info(\\n `*** Failed to Load: ${this.notLoaded.length} Resource(s) ***`\\n )\\n this.getLogger().info(\\n `*** Failed to Resolve: ${this.notResolved.length} URL(s) ***`\\n )\\n this.getLogger().info(\\n `*** Loaded: ${loadedAdded}, Removed: ${loadedRemoved} Tiddler(s) ***`\\n )\\n this.getLogger().info(\\n `*** Processed: ${processed}, Removed: ${processedRemoved} Tiddler(s) ***`\\n )\\n this.getLogger().info(\\n `*** Added: ${this.added.length}, Updated: ${this.updated.length} Tiddler(s) ***`\\n )\\n }\\n // Update Wiki\\n var reportAdded = ''\\n var reportUpdated = ''\\n for (var [title, merged] of this.merged.entries()) {\\n $tw.wiki.addTiddler(merged)\\n if (\\n this.host !== null &&\\n this.merged.get(this.host.fields.title) === undefined\\n ) {\\n if (this.added.indexOf(title) !== -1) {\\n reportAdded = `${reportAdded}[[${title}]]`\\n } else {\\n reportUpdated = `${reportUpdated}[[${title}]]`\\n }\\n }\\n }\\n // Process deleted\\n var deleted = 0\\n var reportDeleted = ''\\n $tw.wiki.forEachTiddler({ includeSystem: true }, function (\\n title,\\n tiddler\\n ) {\\n var value = tiddler.getFieldString('_canonical_uri')\\n if (\\n value !== undefined &&\\n value !== null &&\\n value === self.rootUri &&\\n self.merged.get(title) === undefined\\n ) {\\n if (\\n self.host !== null &&\\n self.merged.get(self.host.fields.title) === undefined &&\\n self.host.fields.title !== title\\n ) {\\n $tw.wiki.deleteTiddler(title)\\n reportDeleted = `${reportDeleted}[[${title}]]`\\n deleted += 1\\n }\\n return\\n }\\n var value = tiddler.getFieldString('_import_uri')\\n if (\\n value !== undefined &&\\n value !== null &&\\n value === self.rootUri &&\\n self.merged.get(title) === undefined\\n ) {\\n if (\\n self.host !== null &&\\n self.merged.get(self.host.fields.title) === undefined &&\\n self.host.fields.title !== title\\n ) {\\n $tw.wiki.deleteTiddler(title)\\n reportDeleted = `${reportDeleted}[[${title}]]`\\n deleted += 1\\n }\\n }\\n })\\n if (this.merged.size > 0) {\\n $tw.utils.alert(\\n name,\\n 'Successfully Imported, Added: ' +\\n this.added.length +\\n ', Deleted: ' +\\n deleted +\\n ', Updated: ' +\\n this.updated.length\\n )\\n }\\n if (\\n this.host !== null &&\\n this.merged.get(this.host.fields.title) === undefined\\n ) {\\n var updatedTiddler = new $tw.Tiddler(this.host)\\n if (this.merged.size === 0) {\\n updatedTiddler = $tw.utils.updateTiddler({\\n tiddler: updatedTiddler,\\n fields: [\\n {\\n key: 'type',\\n value: 'text/vnd.tiddlywiki'\\n },\\n {\\n key: 'text',\\n value: \\\"''No Tiddlers have been Imported''\\\"\\n }\\n ]\\n })\\n } else {\\n const reportAddedMsg = `\u003Cp align='left'>''Added: ${this.added.length}''\u003C/p>`\\n const reportDeletedMsg = `\u003Cp align='left'>''Deleted: ${deleted}''\u003C/p>`\\n const reportImportedMsg =\\n \\\"\u003Cp align='center'>''Successfully Imported''\u003C/p>\\\"\\n const reportUpdatedMsg = `\u003Cp align='left'>''Updated: ${this.updated.length}''\u003C/p>`\\n var value = `${reportImportedMsg}`\\n if (reportAdded.trim() !== '') {\\n value = `${value}\\\\n\\\\n${reportAddedMsg}\\\\n\\\\n{{{${reportAdded}}}}`\\n }\\n if (reportDeleted.trim() !== '') {\\n value = `${value}\\\\n\\\\n${reportDeletedMsg}\\\\n\\\\n{{{${reportDeleted}}}}`\\n }\\n if (reportUpdated.trim() !== '') {\\n value = `${value}\\\\n\\\\n${reportUpdatedMsg}\\\\n\\\\n{{{${reportUpdated}}}}`\\n }\\n updatedTiddler = $tw.utils.updateTiddler({\\n tiddler: updatedTiddler,\\n fields: [\\n {\\n key: 'type',\\n value: 'text/vnd.tiddlywiki'\\n },\\n {\\n key: 'text',\\n value: value\\n }\\n ]\\n })\\n }\\n $tw.wiki.addTiddler(updatedTiddler)\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n }\\n this.getLogger().info('*** End Import ***')\\n this.host = null\\n this.loaded = null\\n this.isEmpty = null\\n this.notLoaded = null\\n this.resolved = null\\n this.notResolved = null\\n this.added = null\\n this.updated = null\\n this.merged = null\\n }\\n\\n IpfsImport.prototype.load = async function (\\n parentUrl,\\n parentTitle,\\n field,\\n url,\\n load\\n ) {\\n var loaded = 0\\n var removed = 0\\n var key = null\\n var resolvedUrl = null\\n if (\\n url !== null &&\\n this.notResolved.indexOf(url) === -1 &&\\n this.resolved.get(url) === undefined\\n ) {\\n try {\\n var { key, resolvedUrl } = await this.getKey(parentUrl, url)\\n this.resolved.set(url, key)\\n } catch (error) {\\n const msg = 'Failed to Resolve:'\\n this.notResolved.push(url)\\n this.getLogger().error(error)\\n $tw.utils.alert(\\n name,\\n alertFieldFailed`${msg} \\\"${field}\\\" from ${parentUrl}\\\">${parentTitle}\u003C/a>`\\n )\\n }\\n }\\n if (\\n load &&\\n key !== null &&\\n resolvedUrl !== null &&\\n this.notLoaded.indexOf(key) === -1 &&\\n this.loaded.get(key) === undefined\\n ) {\\n const {\\n loaded: loadedAdded,\\n removed: loadedRemoved\\n } = await this.loadResource(\\n parentUrl,\\n parentTitle,\\n field,\\n url,\\n key,\\n resolvedUrl\\n )\\n loaded = loadedAdded\\n removed = loadedRemoved\\n }\\n return {\\n loaded: loaded,\\n removed: removed\\n }\\n }\\n\\n IpfsImport.prototype.loadResource = async function (\\n parentUrl,\\n parentTitle,\\n parentField,\\n uri,\\n key,\\n resolvedKey\\n ) {\\n var loaded = 0\\n var removed = 0\\n var content = null\\n var imported = new Map()\\n var tiddlers = null\\n try {\\n // Load\\n content = await $tw.ipfs.loadToUtf8(resolvedKey.toString())\\n if ($tw.ipfs.isJson(content.data)) {\\n tiddlers = $tw.wiki.deserializeTiddlers(\\n '.json',\\n content.data,\\n $tw.wiki.getCreationFields()\\n )\\n } else {\\n tiddlers = $tw.wiki.deserializeTiddlers(\\n '.tid',\\n content.data,\\n $tw.wiki.getCreationFields()\\n )\\n }\\n // Loaded\\n if (tiddlers !== undefined && tiddlers !== null) {\\n this.loaded.set(key, { imported, resolvedKey, uri })\\n for (var i in tiddlers) {\\n const tiddler = tiddlers[i]\\n var title = tiddler.title\\n if (title === undefined || title == null || title.trim() === '') {\\n const msg = 'Ignore Unknown:'\\n const field = 'Title'\\n this.getLogger().info(\\n `${msg} \\\"${field}\\\"\\\\n ${resolvedKey} \\\\n from \\\"${parentField}\\\", \\\"${parentTitle}\\\"\\\\n ${parentUrl}`\\n )\\n $tw.utils.alert(\\n name,\\n alertFailed`${msg} ${resolvedKey}\\\">${field}\u003C/a>, from \\\"${parentField}\\\", ${parentUrl}\\\">${parentTitle}\u003C/a>`\\n )\\n removed += 1\\n continue\\n }\\n if (imported.get(title) !== undefined) {\\n const msg = 'Ignore Duplicate:'\\n this.getLogger().info(\\n `${msg} \\\"${title}\\\"\\\\n ${resolvedKey} \\\\n from \\\"${parentField}\\\", \\\"${parentTitle}\\\"\\\\n ${parentUrl}`\\n )\\n $tw.utils.alert(\\n name,\\n alertFailed`${msg} ${resolvedKey}\\\">${title}\u003C/a>, from \\\"${parentField}\\\", ${parentUrl}\\\">${parentTitle}\u003C/a>`\\n )\\n removed += 1\\n continue\\n }\\n var type = tiddler.type\\n if (type === undefined || type == null) {\\n type = 'text/vnd.tiddlywiki'\\n }\\n var info = $tw.config.contentTypeInfo[type]\\n if (info === undefined || info == null) {\\n const msg = 'Unknown:'\\n const field = 'Content-Type'\\n this.getLogger().info(\\n `${msg} \\\"${field}\\\": \\\"${title}\\\"\\\\n ${resolvedKey}`\\n )\\n $tw.utils.alert(\\n name,\\n alertFieldFailed`${msg} \\\"${field}\\\": ${resolvedKey}\\\">${title}\u003C/a>`\\n )\\n // Default\\n type = 'text/vnd.tiddlywiki'\\n info = $tw.config.contentTypeInfo[type]\\n }\\n tiddler.type = type\\n // Next\\n var canonicalUri = tiddler._canonical_uri\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n tiddler._canonical_uri = canonicalUri\\n var importUri = tiddler._import_uri\\n importUri =\\n importUri === undefined ||\\n importUri == null ||\\n importUri.trim() === ''\\n ? null\\n : importUri.trim()\\n tiddler._import_uri = importUri\\n if (canonicalUri !== null || importUri !== null) {\\n if (importUri !== null) {\\n const {\\n loaded: loadedAdded,\\n removed: loadedRemoved\\n } = await this.load(\\n resolvedKey,\\n title,\\n '_import_uri',\\n importUri,\\n true\\n )\\n loaded += loadedAdded\\n removed += loadedRemoved\\n }\\n if (canonicalUri !== null) {\\n var load = true\\n if (\\n info.encoding === 'base64' ||\\n tiddler.type === 'image/svg+xml'\\n ) {\\n load = false\\n }\\n const {\\n loaded: loadedAdded,\\n removed: loadedRemoved\\n } = await this.load(\\n resolvedKey,\\n title,\\n 'canonical_uri',\\n canonicalUri,\\n load\\n )\\n loaded += loadedAdded\\n removed += loadedRemoved\\n }\\n }\\n imported.set(title, tiddler)\\n loaded += 1\\n }\\n }\\n if (imported.size === 0) {\\n this.isEmpty.push(key)\\n const msg = 'Empty:'\\n const field = 'Resource'\\n this.getLogger().info(\\n `${msg} \\\"${field}\\\"\\\\n ${resolvedKey} \\\\n from \\\"${parentField}\\\", \\\"${parentTitle}\\\"\\\\n ${parentUrl}`\\n )\\n $tw.utils.alert(\\n name,\\n alertFailed`${msg} ${resolvedKey}\\\">${field}\u003C/a> from \\\"${parentField}\\\", ${parentUrl}\\\">${parentTitle}\u003C/a>`\\n )\\n }\\n } catch (error) {\\n this.notLoaded.push(key)\\n const msg = 'Failed to Load:'\\n const field = 'Resource'\\n this.getLogger().info(\\n `${msg} \\\"${field}\\\"\\\\n ${resolvedKey} \\\\n from \\\"${parentField}\\\", \\\"${parentTitle}\\\"\\\\n ${parentUrl}`\\n )\\n this.getLogger().error(error)\\n $tw.utils.alert(\\n name,\\n alertFailed`${msg} ${resolvedKey}\\\">${field}\u003C/a> from \\\"${parentField}\\\", ${parentUrl}\\\">${parentTitle}\u003C/a>`\\n )\\n }\\n return {\\n loaded: loaded,\\n removed: removed\\n }\\n }\\n\\n IpfsImport.prototype.processImported = function () {\\n var processed = 0\\n var removed = 0\\n var processedTitles = []\\n for (var key of this.loaded.keys()) {\\n const { imported, resolvedKey } = this.loaded.get(key)\\n for (var title of imported.keys()) {\\n if (processedTitles.indexOf(title) !== -1) {\\n continue\\n }\\n const keys = []\\n const tiddler = imported.get(title)\\n var type = tiddler.type\\n var info = $tw.config.contentTypeInfo[type]\\n var canonicalUri = tiddler._canonical_uri\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n var importUri = tiddler._import_uri\\n importUri =\\n importUri === undefined ||\\n importUri == null ||\\n importUri.trim() === ''\\n ? null\\n : importUri.trim()\\n if (canonicalUri == null && importUri == null) {\\n keys.push(key)\\n } else if (canonicalUri == null && importUri !== null) {\\n const msg = 'Missing:'\\n const field = '_canonical_uri'\\n this.getLogger().info(\\n `${msg} \\\"${field}\\\" from ${title}\\\"\\\\n ${resolvedKey}`\\n )\\n $tw.utils.alert(\\n name,\\n alertFieldFailed`${msg} \\\"${field}\\\" from ${resolvedKey}\\\">${title}\u003C/a>`\\n )\\n } else {\\n var canonicalKey = null\\n if (\\n canonicalUri !== null &&\\n this.notResolved.indexOf(canonicalUri) === -1\\n ) {\\n canonicalKey = this.resolved.get(canonicalUri)\\n }\\n if (canonicalKey !== undefined && canonicalKey !== null) {\\n if (key === canonicalKey) {\\n const msg = 'Cycle Graph:'\\n const field = '_canonical_uri'\\n this.getLogger().info(\\n `${msg} \\\"${field}\\\" from ${title}\\\"\\\\n ${resolvedKey}`\\n )\\n $tw.utils.alert(\\n name,\\n alertFieldFailed`${msg} \\\"${field}\\\" from ${resolvedKey}\\\">${title}\u003C/a>`\\n )\\n } else if (\\n this.processCanonicalKey(\\n keys,\\n resolvedKey,\\n title,\\n canonicalKey,\\n type,\\n info\\n )\\n ) {\\n var importKey = null\\n if (\\n importUri !== null &&\\n this.notResolved.indexOf(importUri) === -1\\n ) {\\n importKey = this.resolved.get(importUri)\\n }\\n if (importKey === undefined || importKey == null) {\\n keys.push(key)\\n } else {\\n if (canonicalKey === importKey) {\\n const msg = 'Matching:'\\n const field = '\\\"_canonical_uri\\\" and \\\"_import_uri\\\"'\\n this.getLogger().info(\\n `${msg} ${field} from \\\"${title}\\\"\\\\n ${resolvedKey}`\\n )\\n $tw.utils.alert(\\n name,\\n alertFieldFailed`${msg} ${field} from ${resolvedKey}\\\">${title}\u003C/a>`\\n )\\n } else if (key === importKey) {\\n const msg = 'Cycle Graph:'\\n const field = '_import_uri'\\n this.getLogger().info(\\n `${msg} \\\"${field}\\\" from \\\"${title}\\\"\\\\n ${resolvedKey}`\\n )\\n $tw.utils.alert(\\n name,\\n alertFieldFailed`${msg} \\\"${field}\\\" from ${resolvedKey}\\\">${title}\u003C/a>`\\n )\\n } else {\\n keys.push(key)\\n this.processImportKey(\\n keys,\\n resolvedKey,\\n title,\\n canonicalKey,\\n importKey\\n )\\n }\\n }\\n }\\n }\\n }\\n processed += keys.length\\n removed += this.removeTiddlers(keys, title)\\n processedTitles.push(title)\\n }\\n }\\n return {\\n processed: processed,\\n removed: removed\\n }\\n }\\n\\n IpfsImport.prototype.processCanonicalKey = function (\\n keys,\\n parentResolvedKey,\\n title,\\n canonicalKey,\\n type,\\n info\\n ) {\\n if (info.encoding === 'base64' || type === 'image/svg+xml') {\\n keys.push(canonicalKey)\\n return true\\n }\\n if (this.notLoaded.indexOf(canonicalKey) !== -1) {\\n return false\\n }\\n const { imported, resolvedKey } = this.loaded.get(canonicalKey)\\n if (imported === undefined) {\\n return false\\n }\\n const tiddler = imported.get(title)\\n if (tiddler === undefined) {\\n return false\\n }\\n var canonicalUri = tiddler._canonical_uri\\n canonicalUri =\\n canonicalUri == null ||\\n canonicalUri === undefined ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n if (canonicalUri !== null) {\\n const msg = 'Inconsistency:'\\n const field = '_canonical_uri'\\n this.getLogger().info(\\n `${msg} \\\"${field}\\\" from \\\"${title}\\\"\\\\n ${resolvedKey} \\\\n and ${parentResolvedKey}`\\n )\\n $tw.utils.alert(\\n name,\\n alertConditionFailed`${msg} \\\"${field}\\\" from ${resolvedKey}\\\">${title}\u003C/a> and ${parentResolvedKey}\\\">${title}\u003C/a>`\\n )\\n return false\\n }\\n var importUri = tiddler._import_uri\\n importUri =\\n importUri == null || importUri === undefined || importUri.trim() === ''\\n ? null\\n : importUri.trim()\\n if (importUri !== null) {\\n const msg = 'Inconsistency:'\\n const field = '_import_uri'\\n this.getLogger().info(\\n `${msg} \\\"${field}\\\" from \\\"${title}\\\"\\\\n ${resolvedKey} \\\\n and ${parentResolvedKey}`\\n )\\n $tw.utils.alert(\\n name,\\n alertConditionFailed`${msg} \\\"${field}\\\" from ${resolvedKey}\\\">${title}\u003C/a> and ${parentResolvedKey}\\\">${title}\u003C/a>`\\n )\\n return false\\n }\\n keys.push(canonicalKey)\\n return true\\n }\\n\\n IpfsImport.prototype.processImportKey = function (\\n keys,\\n parentResolvedKey,\\n title,\\n canonicalKey,\\n importKey\\n ) {\\n if (this.notLoaded.indexOf(importKey) !== -1) {\\n return\\n }\\n const { imported, resolvedKey: importResolvedKey } = this.loaded.get(\\n importKey\\n )\\n if (imported === undefined) {\\n return\\n }\\n const tiddler = imported.get(title)\\n if (tiddler === undefined) {\\n return\\n }\\n var targetCanonicalUri = tiddler._canonical_uri\\n targetCanonicalUri =\\n targetCanonicalUri == null ||\\n targetCanonicalUri === undefined ||\\n targetCanonicalUri.trim() === ''\\n ? null\\n : targetCanonicalUri.trim()\\n var targetCanonicalKey = null\\n if (\\n targetCanonicalUri !== null &&\\n this.notResolved.indexOf(targetCanonicalUri) === -1\\n ) {\\n targetCanonicalKey = this.resolved.get(targetCanonicalUri)\\n }\\n if (\\n targetCanonicalKey !== undefined &&\\n targetCanonicalKey !== null &&\\n canonicalKey !== targetCanonicalKey\\n ) {\\n const msg = 'Inconsistency:'\\n const field = '_canonical_uri'\\n this.getLogger().info(\\n `${msg} \\\"${field}\\\" from \\\"${title}\\\"\\\\n ${importResolvedKey} \\\\n and ${parentResolvedKey}`\\n )\\n $tw.utils.alert(\\n name,\\n alertConditionFailed`${msg} \\\"${field}\\\" from ${importResolvedKey}\\\">${title}\u003C/a> and ${parentResolvedKey}\\\">${title}\u003C/a>`\\n )\\n return\\n }\\n var nextImportUri = tiddler._import_uri\\n nextImportUri =\\n nextImportUri == null ||\\n nextImportUri === undefined ||\\n nextImportUri.trim() === ''\\n ? null\\n : nextImportUri.trim()\\n if (targetCanonicalUri == null && nextImportUri !== null) {\\n const msg = 'Missing:'\\n const field = '_canonical_uri'\\n this.getLogger().info(\\n `${msg} \\\"${field}\\\" from \\\"${title}\\\"\\\\n ${importResolvedKey}`\\n )\\n $tw.utils.alert(\\n name,\\n alertFieldFailed`${msg} \\\"${field}\\\" from ${importResolvedKey}\\\">${title}\u003C/a>`\\n )\\n return\\n }\\n if (nextImportUri == null) {\\n keys.push(importKey)\\n } else {\\n var nextImportKey = null\\n if (\\n nextImportUri !== null &&\\n this.notResolved.indexOf(nextImportUri) === -1\\n ) {\\n nextImportKey = this.resolved.get(nextImportUri)\\n }\\n if (nextImportKey !== undefined && nextImportKey !== null) {\\n if (canonicalKey === nextImportKey) {\\n const msg = 'Matching:'\\n const field = '\\\"_canonical_uri\\\" and \\\"_import_uri\\\"'\\n this.getLogger().info(\\n `${msg} ${field} from \\\"${title}\\\"\\\\n ${importResolvedKey}`\\n )\\n $tw.utils.alert(\\n name,\\n alertFieldFailed`${msg} ${field} from ${importResolvedKey}\\\">${title}\u003C/a>`\\n )\\n } else if (keys.indexOf(nextImportKey) !== -1) {\\n const msg = 'Cycle Graph:'\\n const field = '_import_uri'\\n this.getLogger().info(\\n `${msg} \\\"${field}\\\" from \\\"${title}\\\"\\\\n ${importResolvedKey}`\\n )\\n $tw.utils.alert(\\n name,\\n alertFieldFailed`${msg} \\\"${field}\\\" from ${importResolvedKey}\\\">${title}\u003C/a>`\\n )\\n } else {\\n keys.push(importKey)\\n this.processImportKey(\\n keys,\\n importResolvedKey,\\n title,\\n canonicalKey,\\n nextImportKey\\n )\\n }\\n }\\n }\\n }\\n\\n IpfsImport.prototype.importTiddlers = function () {\\n var processedTitles = []\\n for (var key of this.loaded.keys()) {\\n const { imported, uri } = this.loaded.get(key)\\n for (var title of imported.keys()) {\\n if (processedTitles.indexOf(title) !== -1) {\\n continue\\n }\\n const tiddler = imported.get(title)\\n var type = tiddler.type\\n var info = $tw.config.contentTypeInfo[type]\\n var canonicalUri = tiddler._canonical_uri\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n var importUri = tiddler._import_uri\\n importUri =\\n importUri === undefined ||\\n importUri == null ||\\n importUri.trim() === ''\\n ? null\\n : importUri.trim()\\n var exist = null\\n if (importUri !== null) {\\n exist = this.importTiddler(title, importUri)\\n }\\n if (\\n exist == null &&\\n canonicalUri !== null &&\\n info.encoding !== 'base64' &&\\n type !== 'image/svg+xml'\\n ) {\\n this.importTiddler(title, canonicalUri)\\n }\\n exist = this.mergeTiddler(title, uri)\\n if (exist !== null) {\\n const merged = this.merged.get(title)\\n var type = merged.type\\n var info = $tw.config.contentTypeInfo[type]\\n if (info.encoding === 'base64' || type === 'image/svg+xml') {\\n merged._import_uri = this.rootUri\\n } else {\\n var canonicalUri = merged._canonical_uri\\n if (canonicalUri === undefined || canonicalUri == null) {\\n if (uri !== this.rootUri) {\\n merged._canonical_uri = this.resolved.get(uri)\\n merged._import_uri = this.rootUri\\n } else {\\n merged._canonical_uri = this.rootUri\\n }\\n } else {\\n merged._canonical_uri = this.resolved.get(merged._canonical_uri)\\n if (canonicalUri !== this.rootUri) {\\n merged._import_uri = this.rootUri\\n }\\n }\\n }\\n if (exist) {\\n this.updated.push(title)\\n } else {\\n this.added.push(title)\\n }\\n processedTitles.push(title)\\n }\\n }\\n }\\n }\\n\\n IpfsImport.prototype.importTiddler = function (title, uri) {\\n const key = this.resolved.get(uri)\\n if (key === undefined) {\\n return null\\n }\\n const { imported } = this.loaded.get(key)\\n if (imported === undefined) {\\n return null\\n }\\n const tiddler = imported.get(title)\\n if (tiddler === undefined) {\\n return null\\n }\\n var type = tiddler.type\\n var info = $tw.config.contentTypeInfo[type]\\n var importUri = tiddler._import_uri\\n importUri =\\n importUri == null || importUri === undefined || importUri.trim() === ''\\n ? null\\n : importUri.trim()\\n var canonicalUri = tiddler._canonical_uri\\n canonicalUri =\\n canonicalUri == null ||\\n canonicalUri === undefined ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n var exist = null\\n if (importUri !== null) {\\n exist = this.importTiddler(title, importUri)\\n }\\n if (\\n exist == null &&\\n canonicalUri !== null &&\\n info.encoding !== 'base64' &&\\n type !== 'image/svg+xml'\\n ) {\\n this.importTiddler(title, canonicalUri)\\n }\\n return this.mergeTiddler(title, uri)\\n }\\n\\n IpfsImport.prototype.mergeTiddler = function (title, uri) {\\n var merged = null\\n var currentTiddler = null\\n const key = this.resolved.get(uri)\\n if (key === undefined) {\\n return null\\n }\\n const { imported } = this.loaded.get(key)\\n if (imported === undefined) {\\n return null\\n }\\n const tiddler = imported.get(title)\\n if (tiddler === undefined) {\\n return null\\n }\\n // Retrieve target host Tiddler\\n if (this.host !== null && this.host.fields.title === title) {\\n currentTiddler = this.host\\n } else {\\n currentTiddler = $tw.wiki.getTiddler(title)\\n }\\n // Retrieve or prepare merged content\\n merged = this.merged.get(title)\\n if (merged === undefined) {\\n merged = {}\\n this.merged.set(title, merged)\\n }\\n // Tags\\n var tags = tiddler.tags !== undefined ? tiddler.tags : ''\\n // Fields\\n var hasModified = false\\n for (var field in tiddler) {\\n // Discard\\n if (field === 'tags') {\\n continue\\n }\\n if (field === 'modified') {\\n hasModified = true\\n }\\n // Unknown from leaf to top, we keep the top modified field\\n if (\\n merged[field] === undefined ||\\n merged[field] == null ||\\n field === '_canonical_uri' ||\\n field === '_import_uri' ||\\n field === 'modified'\\n ) {\\n merged[field] = tiddler[field]\\n }\\n }\\n if (hasModified === false) {\\n merged.modified = new Date()\\n }\\n // Merge current Tiddler Tags\\n if (currentTiddler !== undefined && currentTiddler !== null) {\\n const currentTags = (currentTiddler.fields.tags || []).slice(0)\\n for (var i = 0; i \u003C currentTags.length; i++) {\\n const currentTag = currentTags[i]\\n if (tags.includes(currentTag) === false) {\\n tags = `${tags} [[${currentTag}]]`\\n }\\n }\\n }\\n // Merge merged Tags\\n if (merged.tags !== undefined && merged.tags !== null) {\\n const mergedTags = $tw.utils.parseStringArray(merged.tags, false)\\n for (var i = 0; i \u003C mergedTags.length; i++) {\\n const mergedTag = mergedTags[i]\\n if (tags.includes(mergedTag) === false) {\\n tags = `${tags} [[${mergedTag}]]`\\n }\\n }\\n }\\n // IPFS tag\\n if (this.isIpfs(key) && tags.includes('$:/isIpfs') === false) {\\n tags = `${tags} $:/isIpfs`\\n }\\n // Imported tag\\n if (tags.includes('$:/isImported') === false) {\\n tags = `${tags} $:/isImported`\\n }\\n // Processed tags\\n merged.tags = tags\\n if (currentTiddler !== undefined && currentTiddler !== null) {\\n return true\\n }\\n return false\\n }\\n\\n exports.IpfsImport = IpfsImport\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"library\"\n },\n \"$:/plugins/ipfs/macro/ipfs-info-saver.js\": {\n \"title\": \"$:/plugins/ipfs/macro/ipfs-info-saver.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/macro/ipfs-info-saver.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: macro\\n\\nIPFS info saver\\n\\n\\\\*/\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n /*\\n * Information about this macro\\n */\\n exports.name = 'ipfs-info-saver'\\n\\n exports.params = [{ name: 'tiddler' }]\\n\\n /*\\n * Run the macro\\n */\\n exports.run = function (tiddler) {\\n return $tw.saverHandler.getSaver(tiddler).module.info.name\\n }\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"macro\"\n },\n \"$:/plugins/ipfs/modules/widgets/ipfs-link.js\": {\n \"title\": \"$:/plugins/ipfs/modules/widgets/ipfs-link.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/modules/widgets/ipfs-link.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nIPFS link widget\\n\\n\\\\*/\\n\\n/**\\n * TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n *\\n * Copyright (c) 2004-2007, Jeremy Ruston\\n * Copyright (c) 2007-2018, UnaMesa Association\\n * Copyright (c) 2019-2020, Blue Light\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are met:\\n *\\n * * Redistributions of source code must retain the above copyright notice, this\\n * list of conditions and the following disclaimer.\\n *\\n * * Redistributions in binary form must reproduce the above copyright notice,\\n * this list of conditions and the following disclaimer in the documentation\\n * and/or other materials provided with the distribution.\\n *\\n * * Neither the name of the copyright holder nor the names of its\\n * contributors may be used to endorse or promote products derived from\\n * this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n var Widget = require('$:/core/modules/widgets/widget.js').widget\\n\\n const name = 'ipfs-link'\\n\\n var IpfsLinkWidget = function (parseTreeNode, options) {\\n this.initialise(parseTreeNode, options)\\n }\\n\\n /*\\n * Inherit from the base widget class\\n */\\n IpfsLinkWidget.prototype = new Widget()\\n\\n IpfsLinkWidget.prototype.getLogger = function () {\\n return window.log.getLogger(name)\\n }\\n\\n /*\\n * Render this widget into the DOM\\n */\\n IpfsLinkWidget.prototype.render = function (parent, nextSibling) {\\n var self = this\\n // Save the parent dom node\\n this.parentDomNode = parent\\n // Compute our attributes\\n this.computeAttributes()\\n // Execute our logic\\n this.execute()\\n // Tiddler link\\n var value = this.url !== undefined ? this.url : this.value\\n var tiddler = $tw.wiki.getTiddler(value)\\n if (tiddler !== undefined && tiddler !== null) {\\n this.renderTiddlerLink(parent, nextSibling)\\n } else {\\n this.renderText(parent, nextSibling)\\n $tw.ipfs\\n .resolveUrl(false, false, value)\\n .then(data => {\\n var { normalizedUrl } = data\\n if (normalizedUrl !== null) {\\n self.removeChildDomNodes()\\n self.renderExternalLink(parent, nextSibling, normalizedUrl)\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n })\\n }\\n }\\n\\n /*\\n * Render this widget into the DOM\\n */\\n IpfsLinkWidget.prototype.renderExternalLink = function (\\n parent,\\n nextSibling,\\n url\\n ) {\\n // Sanitise the specified tag\\n var tag = this.linkTag\\n if ($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\\n tag = 'a'\\n }\\n // Create our element\\n var namespace = this.getVariable('namespace', {\\n defaultValue: 'http://www.w3.org/1999/xhtml'\\n })\\n var domNode = this.document.createElementNS(namespace, tag)\\n domNode.setAttribute('href', url)\\n // Add a click event handler\\n $tw.utils.addEventListeners(domNode, [\\n {\\n name: 'click',\\n handlerObject: this,\\n handlerMethod: 'handleExternalClickEvent'\\n }\\n ])\\n // Assign classes\\n var classes = []\\n if (this.classes) {\\n classes.push(this.classes)\\n }\\n if (classes.length > 0) {\\n domNode.setAttribute('class', classes.join(' '))\\n }\\n if (this['aria-label']) {\\n domNode.setAttribute('aria-label', this['aria-label'])\\n }\\n // Insert the URL into the DOM and render any children\\n parent.insertBefore(domNode, nextSibling)\\n // Process\\n this.renderChildren(domNode, null)\\n this.domNodes.push(domNode)\\n }\\n\\n /*\\n * Render this widget into the DOM\\n */\\n IpfsLinkWidget.prototype.renderTiddlerLink = function (parent, nextSibling) {\\n // self\\n var self = this\\n // Sanitise the specified tag\\n var tag = this.linkTag\\n if ($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\\n tag = 'a'\\n }\\n var value = this.url !== undefined ? this.url : this.value\\n var isMissing = !this.wiki.tiddlerExists(value)\\n var isShadow = this.wiki.isShadowTiddler(value)\\n // Create our element\\n var namespace = this.getVariable('namespace', {\\n defaultValue: 'http://www.w3.org/1999/xhtml'\\n })\\n var domNode = this.document.createElementNS(namespace, tag)\\n // Assign classes\\n var classes = []\\n if (this.overrideClasses === undefined) {\\n classes.push('tc-tiddlylink')\\n if (isShadow) {\\n classes.push('tc-tiddlylink-shadow')\\n }\\n if (isMissing && !isShadow) {\\n classes.push('tc-tiddlylink-missing')\\n } else {\\n if (!isMissing) {\\n classes.push('tc-tiddlylink-resolves')\\n }\\n }\\n if (this.linkClasses) {\\n classes.push(this.linkClasses)\\n }\\n } else if (this.overrideClasses !== '') {\\n classes.push(this.overrideClasses)\\n }\\n if (classes.length > 0) {\\n domNode.setAttribute('class', classes.join(' '))\\n }\\n // Set an href\\n var wikilinkTransformFilter = this.getVariable('tv-filter-export-link')\\n var wikiLinkText\\n if (wikilinkTransformFilter) {\\n // Use the filter to construct the href\\n wikiLinkText = this.wiki.filterTiddlers(\\n wikilinkTransformFilter,\\n this,\\n function (iterator) {\\n iterator(self.wiki.getTiddler(value), value)\\n }\\n )[0]\\n } else {\\n // Expand the tv-wikilink-template variable to construct the href\\n var wikiLinkTemplateMacro = this.getVariable('tv-wikilink-template')\\n var wikiLinkTemplate = wikiLinkTemplateMacro\\n ? wikiLinkTemplateMacro.trim()\\n : '#$uri_encoded$'\\n wikiLinkText = $tw.utils.replaceString(\\n wikiLinkTemplate,\\n '$uri_encoded$',\\n encodeURIComponent(value)\\n )\\n wikiLinkText = $tw.utils.replaceString(\\n wikiLinkText,\\n '$uri_doubleencoded$',\\n encodeURIComponent(encodeURIComponent(value))\\n )\\n }\\n // Override with the value of tv-get-export-link if defined\\n wikiLinkText = this.getVariable('tv-get-export-link', {\\n params: [{ name: 'to', value: value }],\\n defaultValue: wikiLinkText\\n })\\n if (tag === 'a') {\\n var namespaceHref =\\n namespace === 'http://www.w3.org/2000/svg'\\n ? 'http://www.w3.org/1999/xlink'\\n : undefined\\n domNode.setAttributeNS(namespaceHref, 'href', wikiLinkText)\\n }\\n // Set the tabindex\\n if (this.tabIndex) {\\n domNode.setAttribute('tabindex', this.tabIndex)\\n }\\n // Set the tooltip\\n // HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \\\"\u003C$transclude field='tooltip'>\u003C$transclude field='title'/>\u003C/$transclude>\\\"\\n var tooltipWikiText =\\n this.tooltip || this.getVariable('tv-wikilink-tooltip')\\n if (tooltipWikiText) {\\n var tooltipText = this.wiki.renderText(\\n 'text/plain',\\n 'text/vnd.tiddlywiki',\\n tooltipWikiText,\\n {\\n parseAsInline: true,\\n variables: {\\n currentTiddler: value\\n },\\n parentWidget: this\\n }\\n )\\n domNode.setAttribute('title', tooltipText)\\n }\\n if (this['aria-label']) {\\n domNode.setAttribute('aria-label', this['aria-label'])\\n }\\n // Add a click event handler\\n $tw.utils.addEventListeners(domNode, [\\n {\\n name: 'click',\\n handlerObject: this,\\n handlerMethod: 'handleTiddlerClickEvent'\\n }\\n ])\\n // Make the link draggable if required\\n if (this.draggable === 'yes') {\\n $tw.utils.makeDraggable({\\n domNode: domNode,\\n dragTiddlerFn: function () {\\n return value\\n },\\n widget: this\\n })\\n }\\n // Insert the link into the DOM and render any children\\n parent.insertBefore(domNode, nextSibling)\\n // Process\\n this.renderChildren(domNode, null)\\n this.domNodes.push(domNode)\\n }\\n\\n /*\\n * Render this widget into the DOM\\n */\\n IpfsLinkWidget.prototype.renderText = function (parent, nextSibling) {\\n const domNode = this.document.createElement('span')\\n // Insert the text into the DOM and render any children\\n parent.insertBefore(domNode, nextSibling)\\n // Process\\n this.renderChildren(domNode, null)\\n this.domNodes.push(domNode)\\n }\\n\\n IpfsLinkWidget.prototype.handleExternalClickEvent = function (event) {\\n const self = this\\n const value = this.url !== undefined ? this.url : this.value\\n $tw.ipfs\\n .resolveUrl(true, true, value)\\n .then(data => {\\n const { resolvedUrl } = data\\n if (resolvedUrl !== null) {\\n window.open(resolvedUrl.toString(), '_blank', 'noopener,noreferrer')\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n event.preventDefault()\\n event.stopPropagation()\\n return false\\n }\\n\\n IpfsLinkWidget.prototype.handleTiddlerClickEvent = function (event) {\\n // Send the click on its way as a navigate event\\n const bounds = this.domNodes[0].getBoundingClientRect()\\n const value = this.url !== undefined ? this.url : this.value\\n this.dispatchEvent({\\n type: 'tm-navigate',\\n navigateTo: value,\\n navigateFromTitle: this.getVariable('storyTiddler'),\\n navigateFromNode: this,\\n navigateFromClientRect: {\\n top: bounds.top,\\n left: bounds.left,\\n width: bounds.width,\\n right: bounds.right,\\n bottom: bounds.bottom,\\n height: bounds.height\\n },\\n navigateSuppressNavigation:\\n event.metaKey || event.ctrlKey || event.button === 1,\\n metaKey: event.metaKey,\\n ctrlKey: event.ctrlKey,\\n altKey: event.altKey,\\n shiftKey: event.shiftKey\\n })\\n if (this.domNodes[0].hasAttribute('href')) {\\n event.preventDefault()\\n }\\n event.stopPropagation()\\n return false\\n }\\n\\n /*\\n * Compute the internal state of the widget\\n */\\n IpfsLinkWidget.prototype.execute = function () {\\n // Pick up our attributes\\n this.url = undefined\\n this.tiddler =\\n this.getAttribute('tiddler') !== undefined\\n ? this.getAttribute('tiddler')\\n : this.getVariable('currentTiddler')\\n const tiddler = $tw.wiki.getTiddler(this.tiddler)\\n this.field = this.getAttribute('field')\\n this.value =\\n this.getAttribute('value') !== undefined\\n ? this.getAttribute('value')\\n : tiddler.getFieldString(this.field) !== ''\\n ? tiddler.getFieldString(this.field)\\n : this.tiddler\\n if (\\n this.getAttribute('value') !== undefined &&\\n tiddler.getFieldString(this.getAttribute('value')) !== ''\\n ) {\\n this.url = tiddler.getFieldString(this.getAttribute('value'))\\n }\\n this.tooltip = this.getAttribute('tooltip')\\n this['aria-label'] = this.getAttribute('aria-label')\\n this.linkClasses = this.getAttribute('class') || 'tc-ipfs-link-external'\\n this.overrideClasses = this.getAttribute('overrideClass')\\n this.tabIndex = this.getAttribute('tabindex')\\n this.draggable = this.getAttribute('draggable', 'yes')\\n this.linkTag = this.getAttribute('tag', 'a')\\n var templateTree\\n if (this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\\n templateTree = this.parseTreeNode.children\\n } else {\\n templateTree = [{ type: 'text', text: this.value }]\\n }\\n this.makeChildWidgets(templateTree)\\n }\\n\\n /*\\n * Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n */\\n IpfsLinkWidget.prototype.refresh = function (changedTiddlers) {\\n const changedAttributes = this.computeAttributes()\\n const tiddler = $tw.wiki.getTiddler(this.tiddler)\\n var value = null\\n if (this.field !== undefined && this.field !== null) {\\n value = tiddler.getFieldString(this.field)\\n }\\n if (\\n changedAttributes.field ||\\n changedTiddlers[this.field] ||\\n changedAttributes.value ||\\n changedTiddlers[this.value] ||\\n changedAttributes.tooltip ||\\n changedAttributes['aria-label'] ||\\n changedTiddlers['$:/ipfs/saver/gateway'] ||\\n changedTiddlers['$:/ipfs/saver/policy'] ||\\n (value !== null && value !== this.value)\\n ) {\\n this.refreshSelf()\\n return true\\n }\\n return this.refreshChildren(changedTiddlers)\\n }\\n\\n exports.ipfslink = IpfsLinkWidget\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"module-type\": \"widget\"\n },\n \"$:/plugins/ipfs/macro/ipfs-plugin-version.js\": {\n \"title\": \"$:/plugins/ipfs/macro/ipfs-plugin-version.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/macro/ipfs-plugin-version.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: macro\\n\\nIPFS plugin version\\n\\n\\\\*/\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n /*\\n * Information about this macro\\n */\\n exports.name = 'ipfs-plugin-version'\\n\\n exports.params = []\\n\\n /*\\n * Run the macro\\n */\\n exports.run = function () {\\n return $tw.wiki.getTiddler('$:/plugins/ipfs').fields.version\\n }\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"macro\"\n },\n \"$:/plugins/ipfs/ipfs-saver.js\": {\n \"title\": \"$:/plugins/ipfs/ipfs-saver.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/ipfs-saver.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: saver\\n\\nIPFS Saver\\n\\n\\\\*/\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n const log = require('$:/plugins/ipfs/loglevel/loglevel.js')\\n\\n const EnsAction = require('$:/plugins/ipfs/ens-action.js').EnsAction\\n const IpfsAction = require('$:/plugins/ipfs/ipfs-action.js').IpfsAction\\n const IpfsController = require('$:/plugins/ipfs/ipfs-controller.js')\\n .IpfsController\\n const IpfsTiddler = require('$:/plugins/ipfs/ipfs-tiddler.js').IpfsTiddler\\n\\n const ensKeyword = 'ens'\\n const ipfsKeyword = 'ipfs'\\n const ipnsKeyword = 'ipns'\\n\\n const name = 'ipfs-saver'\\n\\n /*\\n * Select the appropriate saver module and set it up\\n */\\n var IpfsSaver = function (wiki) {\\n this.wiki = wiki\\n this.apiUrl = null\\n this.ipfsProvider = null\\n // Loglevel\\n if (window.log === undefined || window.log == null) {\\n // Init\\n window.log = log.noConflict()\\n if ($tw.utils.getIpfsVerbose()) {\\n log.setLevel('info', false)\\n } else {\\n log.setLevel('warn', false)\\n }\\n }\\n // Controller\\n $tw.ipfs = new IpfsController()\\n // Listener\\n this.ensAction = new EnsAction()\\n this.ipfsAction = new IpfsAction()\\n this.ipfsTiddler = new IpfsTiddler()\\n // Init\\n this.ensAction.init()\\n this.ipfsAction.init()\\n this.ipfsTiddler.init()\\n // Logger\\n const logger = window.log.getLogger(name)\\n // Log\\n logger.info('ipfs-saver is starting up...')\\n // Log url policy\\n const base = $tw.ipfs.getIpfsBaseUrl()\\n if ($tw.utils.getIpfsUrlPolicy() === 'origin') {\\n logger.info(`Origin base URL: ${base}`)\\n } else {\\n logger.info(`Gateway base URL: ${base}`)\\n }\\n }\\n\\n IpfsSaver.prototype.getLogger = function () {\\n return window.log.getLogger(name)\\n }\\n\\n IpfsSaver.prototype.save = async function (text, method, callback, options) {\\n if ($tw.saverHandler.isDirty() === false) {\\n return false\\n }\\n try {\\n var cid = null\\n var ipnsCid = null\\n var ipnsKey = null\\n var ipnsName = null\\n var ensDomain = null\\n var ensCid = null\\n var options = options || {}\\n const wiki = $tw.ipfs.getDocumentUrl()\\n const base = $tw.ipfs.getIpfsBaseUrl()\\n const nextWiki = $tw.ipfs.getUrl(wiki)\\n nextWiki.protocol = base.protocol\\n nextWiki.host = base.host\\n nextWiki.port = base.port\\n try {\\n var { cid, ipnsKey } = await $tw.ipfs.resolveUrl(false, true, wiki)\\n if (cid != null) {\\n await $tw.ipfs.requestToUnpin(cid)\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n callback(error.message)\\n return true\\n }\\n // IPNS\\n if (ipnsKey !== null || $tw.utils.getIpfsProtocol() === ipnsKeyword) {\\n // Resolve current IPNS\\n if (ipnsKey !== null) {\\n try {\\n var { cid: ipnsCid, ipnsName } = await $tw.ipfs.resolveUrl(\\n true,\\n false,\\n wiki\\n )\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n }\\n } else {\\n // Default IPNS\\n ipnsKey = $tw.utils.getIpfsIpnsKey()\\n ipnsKey =\\n ipnsKey === undefined || ipnsKey == null || ipnsKey.trim() === ''\\n ? null\\n : ipnsKey.trim()\\n ipnsName = $tw.utils.getIpfsIpnsName()\\n ipnsName =\\n ipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n ? null\\n : ipnsName.trim()\\n if (ipnsKey == null && ipnsName == null) {\\n callback(null, 'Unknown default IPNS identifiers...')\\n return true\\n }\\n this.getLogger().info('Processing default IPNS identifiers...')\\n var identifier = ipnsKey\\n if (identifier == null) {\\n identifier = ipnsName\\n }\\n try {\\n var { cid: ipnsCid, ipnsKey, ipnsName } = await $tw.ipfs.resolveUrl(\\n true,\\n false,\\n `/${ipnsKeyword}/${identifier}`\\n )\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n }\\n }\\n if (ipnsCid != null) {\\n await $tw.ipfs.requestToUnpin(ipnsCid)\\n }\\n }\\n // ENS\\n if ($tw.utils.getIpfsProtocol() === ensKeyword) {\\n ensDomain = $tw.utils.getIpfsEnsDomain()\\n if (ensDomain == null) {\\n callback(null, 'Undefined ENS domain...')\\n return true\\n }\\n var { cid: ensCid } = await $tw.ipfs.resolveUrl(false, true, ensDomain)\\n if (ensCid != null) {\\n await $tw.ipfs.requestToUnpin(ensCid)\\n }\\n }\\n // Upload current document\\n this.getLogger().info(`Uploading wiki: ${text.length} bytes`)\\n // Add\\n const { added } = await $tw.ipfs.addToIpfs(text)\\n // Default next\\n nextWiki.pathname = `/${ipfsKeyword}/${added}`\\n // Pin\\n try {\\n await $tw.ipfs.pinToIpfs(added)\\n } catch (error) {\\n this.getLogger().warn(error)\\n $tw.utils.alert(name, error.message)\\n }\\n // Publish to IPNS\\n if (ipnsKey !== null && ipnsName !== null) {\\n $tw.utils.alert(name, `Publishing IPNS name: ${ipnsName}`)\\n try {\\n await $tw.ipfs.publishIpnsName(added, ipnsKey, ipnsName)\\n nextWiki.pathname = `/${ipnsKeyword}/${ipnsKey}`\\n $tw.utils.alert(name, `Successfully Published IPNS name: ${ipnsName}`)\\n } catch (error) {\\n this.getLogger().warn(error)\\n $tw.utils.alert(name, error.message)\\n $tw.ipfs.requestToPin(ipnsCid)\\n }\\n }\\n // Publish to ENS\\n if ($tw.utils.getIpfsProtocol() === ensKeyword) {\\n try {\\n $tw.utils.alert(name, `Publishing to ENS: ${ensDomain}`)\\n await $tw.ipfs.setEns(ensDomain, added)\\n // const chainId = $tw.ipfs.getChainId()\\n // if (chainId !== null && chainId === 1) {\\n // nextWiki.protocol = 'https:'\\n // nextWiki.host = ensDomain\\n // } else {\\n const { resolvedUrl } = await $tw.ipfs.resolveEns(ensDomain)\\n nextWiki.protocol = resolvedUrl.protocol\\n nextWiki.host = resolvedUrl.host\\n nextWiki.pathname = resolvedUrl.pathname\\n // }\\n $tw.utils.alert(name, `Successfully published to ENS: ${ensDomain}`)\\n } catch (error) {\\n this.getLogger().warn(error)\\n $tw.utils.alert(name, error.message)\\n $tw.ipfs.requestToPin(ensCid)\\n }\\n }\\n $tw.ipfs.pin = []\\n // Unpin\\n if ($tw.utils.getIpfsUnpin()) {\\n for (var i in $tw.ipfs.unpin) {\\n try {\\n const unpin = $tw.ipfs.unpin[i]\\n await $tw.ipfs.unpinFromIpfs(unpin)\\n } catch (error) {\\n this.getLogger().warn(error)\\n $tw.utils.alert(name, error.message)\\n }\\n }\\n }\\n $tw.ipfs.unpin = []\\n // Pin\\n for (var i in $tw.ipfs.pin) {\\n try {\\n const pin = $tw.ipfs.pin[i]\\n await $tw.ipfs.pinToIpfs(pin)\\n } catch (error) {\\n this.getLogger().warn(error)\\n $tw.utils.alert(name, error.message)\\n }\\n }\\n callback(null)\\n if (nextWiki.host !== wiki.host || nextWiki.pathname !== wiki.pathname) {\\n window.location.assign(nextWiki.toString())\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n callback(error.message)\\n return true\\n }\\n callback(null)\\n return true\\n }\\n\\n /*\\n * Information about this saver\\n */\\n IpfsSaver.prototype.info = {\\n name: 'Ipfs',\\n priority: 3100,\\n capabilities: ['save']\\n }\\n\\n /*\\n * Static method that returns true if this saver is capable of working\\n */\\n exports.canSave = function (wiki) {\\n return true\\n }\\n\\n /*\\n * Create an instance of this saver\\n */\\n exports.create = function (wiki) {\\n return new IpfsSaver(wiki)\\n }\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"saver\"\n },\n \"$:/plugins/ipfs/operator/ipfs-savers.js\": {\n \"title\": \"$:/plugins/ipfs/operator/ipfs-savers.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/operator/ipfs-savers.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nThis Filter operator return savers title\\n\\n\\\\*/\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n /*\\n Export our filter function\\n */\\n exports.savers = function (source, operator, options) {\\n var results = []\\n for (var i in $tw.saverHandler.savers) {\\n results.push($tw.saverHandler.savers[i].title)\\n }\\n return results\\n }\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"module-type\": \"filteroperator\"\n },\n \"$:/plugins/ipfs/ipfs-startup.js\": {\n \"title\": \"$:/plugins/ipfs/ipfs-startup.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/ipfs-startup.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: startup\\n\\nStartup initialisation\\n\\n\\\\*/\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n exports.platforms = ['browser']\\n exports.after = ['startup']\\n exports.synchronous = true\\n\\n exports.startup = function () {\\n // Logger name\\n const name = 'ipfs-startup'\\n // Missing Media Types\\n $tw.utils.registerFileType('application/gzip', 'base64', '.gz')\\n $tw.utils.registerFileType('audio/mpeg', 'base64', '.mp2')\\n $tw.utils.registerFileType('image/jpg', 'base64', ['.jpg', '.jpeg'], {\\n flags: ['image']\\n })\\n $tw.utils.registerFileType('video/quicktime', 'base64', ['.mov', '.qt'])\\n // Log\\n const logger = window.log.getLogger(name)\\n logger.info('ipfs-startup is starting up...')\\n }\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"startup\"\n },\n \"$:/plugins/ipfs/ipfs-tiddler.js\": {\n \"title\": \"$:/plugins/ipfs/ipfs-tiddler.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/ipfs-tiddler.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: library\\n\\nIPFS Tiddler\\n\\n\\\\*/\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n const IpfsImport = require('$:/plugins/ipfs/ipfs-import.js').IpfsImport\\n\\n const name = 'ipfs-tiddler'\\n\\n /*\\n * https://tiddlywiki.com/#TiddlerFields\\n * $:/core/modules/server/routes/get-tiddler.js\\n * TODO: expose it as Tiddler ??\\n */\\n const reservedFields = [\\n 'bag',\\n 'caption',\\n 'class',\\n 'color',\\n 'description',\\n 'created',\\n 'creator',\\n 'fields',\\n 'footer',\\n 'hide-body',\\n 'icon',\\n '_is_skinny',\\n 'library',\\n 'list',\\n 'list-after',\\n 'list-before',\\n 'modified',\\n 'modifier',\\n 'name',\\n 'plugin-priority',\\n 'plugin-type',\\n 'permissions',\\n 'recipe',\\n 'revision',\\n // \\\"source\\\",\\n 'subtitle',\\n 'tags',\\n 'text',\\n // \\\"url\\\",\\n 'throttle.refresh',\\n 'toc-link',\\n 'title',\\n 'type'\\n ]\\n\\n var IpfsTiddler = function () {\\n this.once = false\\n }\\n\\n IpfsTiddler.prototype.getLogger = function () {\\n return window.log.getLogger(name)\\n }\\n\\n IpfsTiddler.prototype.init = function () {\\n // Init once\\n if (this.once) {\\n return\\n }\\n const self = this\\n // Wiki\\n $tw.wiki.addEventListener('change', function (changes) {\\n return self.handleChangeEvent(changes)\\n })\\n // Hook\\n $tw.hooks.addHook('th-deleting-tiddler', async function (tiddler) {\\n return await self.handleDeleteTiddler(tiddler)\\n })\\n $tw.hooks.addHook('th-importing-tiddler', function (tiddler) {\\n return self.handleFileImport(tiddler)\\n })\\n $tw.hooks.addHook('th-saving-tiddler', async function (tiddler) {\\n return await self.handleSaveTiddler(tiddler)\\n })\\n // Widget\\n $tw.rootWidget.addEventListener('tm-ipfs-pin', function (event) {\\n return self.handleIpfsPin(event)\\n })\\n $tw.rootWidget.addEventListener('tm-refresh-tiddler', function (event) {\\n return self.handleRefreshTiddler(event)\\n })\\n $tw.rootWidget.addEventListener('tm-ipfs-unpin', function (event) {\\n return self.handleIpfsUnpin(event)\\n })\\n // Init once\\n this.once = true\\n }\\n\\n IpfsTiddler.prototype.handleChangeEvent = function (changes) {\\n // Gateway preference\\n const gateway = changes['$:/ipfs/saver/gateway']\\n if (gateway !== undefined && gateway.modified) {\\n const base = $tw.ipfs.getIpfsBaseUrl()\\n if ($tw.utils.getIpfsUrlPolicy() === 'gateway') {\\n this.getLogger().info(`Gateway Relative URL:\\\\n ${base}`)\\n }\\n }\\n // Policy preference\\n const policy = changes['$:/ipfs/saver/policy']\\n if (policy !== undefined && policy.modified) {\\n const base = $tw.ipfs.getIpfsBaseUrl()\\n if ($tw.utils.getIpfsUrlPolicy() === 'origin') {\\n this.getLogger().info(`Origin base URL: ${base}`)\\n } else {\\n this.getLogger().info(`Gateway base URL: ${base}`)\\n }\\n }\\n // Unpin preference\\n const unpin = changes['$:/ipfs/saver/unpin']\\n if (unpin !== undefined && unpin.modified) {\\n if ($tw.utils.getIpfsUnpin()) {\\n this.getLogger().info('Unpin previous IPFS content...')\\n } else {\\n this.getLogger().info('Do not unpin previous IPFS content...')\\n }\\n }\\n // Verbose preference\\n const verbose = changes['$:/ipfs/saver/verbose']\\n if (verbose !== undefined && verbose.modified) {\\n if ($tw.utils.getIpfsVerbose()) {\\n this.updateLoggers('info')\\n } else {\\n this.updateLoggers('warn')\\n }\\n }\\n }\\n\\n IpfsTiddler.prototype.handleIpfsPin = function (event) {\\n const title = event.tiddlerTitle\\n const tiddler = $tw.wiki.getTiddler(title)\\n if (event.param !== undefined && event.param !== null) {\\n // Tiddler\\n for (var field in tiddler.fields) {\\n if (reservedFields.indexOf(field) !== -1) {\\n continue\\n }\\n var value = tiddler.getFieldString(field)\\n value =\\n value === undefined || value == null || value.trim() === ''\\n ? null\\n : value.trim()\\n if (value !== null) {\\n this.ipfsPin(value, field)\\n }\\n }\\n return true\\n }\\n // Wiki\\n this.ipfsPin($tw.ipfs.getDocumentUrl().toString(), 'Wiki')\\n return true\\n }\\n\\n IpfsTiddler.prototype.ipfsPin = function (value, field) {\\n const self = this\\n $tw.ipfs\\n .resolveUrl(true, true, value)\\n .then(data => {\\n const { cid, resolvedUrl } = data\\n if (resolvedUrl !== null && cid !== null) {\\n self.getLogger().info(`Pinning: \\\"${field}\\\"\\\\n ${resolvedUrl}`)\\n $tw.ipfs\\n .pinToIpfs(cid)\\n .then(data => {\\n if (data) {\\n $tw.ipfs.removeFromPinUnpin(cid, resolvedUrl)\\n $tw.utils.alert(\\n name,\\n `Successfully Pinned : \u003Ca rel=\\\"noopener noreferrer\\\" target=\\\"_blank\\\" href=\\\"${resolvedUrl}\\\">${field}\u003C/a>`\\n )\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n }\\n\\n IpfsTiddler.prototype.handleIpfsUnpin = async function (event) {\\n const title = event.tiddlerTitle\\n const tiddler = $tw.wiki.getTiddler(title)\\n const { type, info } = $tw.utils.getContentType(title, tiddler.fields.type)\\n if (event.param !== undefined && event.param !== null) {\\n // Tiddler\\n for (var field in tiddler.fields) {\\n if (reservedFields.indexOf(field) !== -1) {\\n continue\\n }\\n var value = tiddler.getFieldString(field)\\n value =\\n value === undefined || value == null || value.trim() === ''\\n ? null\\n : value.trim()\\n if (value !== null) {\\n if (info.encoding !== 'base64' && type !== 'image/svg+xml') {\\n if (field === '_canonical_uri' || field === '_import_uri') {\\n continue\\n }\\n }\\n this.ipfsUnpin(value, field)\\n }\\n }\\n return true\\n }\\n // Wiki\\n this.ipfsUnpin($tw.ipfs.getDocumentUrl().toString(), 'Wiki')\\n return true\\n }\\n\\n IpfsTiddler.prototype.ipfsUnpin = function (value, field) {\\n value =\\n value === undefined || value == null || value.trim() === ''\\n ? null\\n : value.trim()\\n if (value == null) {\\n return\\n }\\n field =\\n field === undefined || field == null || field.trim() === ''\\n ? null\\n : field.trim()\\n if (field == null) {\\n return\\n }\\n const self = this\\n $tw.ipfs\\n .resolveUrl(true, true, value)\\n .then(data => {\\n const { cid, resolvedUrl } = data\\n if (resolvedUrl !== null && cid !== null) {\\n self.getLogger().info(`Unpinning: \\\"${field}\\\\n ${resolvedUrl}`)\\n if ($tw.utils.getIpfsUnpin()) {\\n $tw.ipfs\\n .unpinFromIpfs(cid)\\n .then(data => {\\n if (data !== undefined && data !== null) {\\n $tw.ipfs.removeFromPinUnpin(cid, resolvedUrl)\\n $tw.utils.alert(\\n name,\\n `Successfully Unpinned : \u003Ca rel=\\\"noopener noreferrer\\\" target=\\\"_blank\\\" href=\\\"${resolvedUrl}\\\">${field}\u003C/a>`\\n )\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n }\\n }\\n })\\n .catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n }\\n\\n IpfsTiddler.prototype.updateLoggers = function (level) {\\n window.log.setLevel(level, false)\\n const loggers = window.log.getLoggers()\\n for (var property in loggers) {\\n if (Object.prototype.hasOwnProperty.call(loggers, property)) {\\n const logger = window.log.getLogger(property)\\n logger.setLevel(level, false)\\n }\\n }\\n }\\n\\n IpfsTiddler.prototype.handleDeleteTiddler = async function (tiddler) {\\n try {\\n const { type, info } = $tw.utils.getContentType(\\n tiddler.fields.title,\\n tiddler.fields.type\\n )\\n // Process\\n var field = null\\n if (info.encoding === 'base64' || type === 'image/svg+xml') {\\n field = '_canonical_uri'\\n } else {\\n field = '_export_uri'\\n }\\n // Value\\n var url = null\\n const value = tiddler.getFieldString(field)\\n if (value !== undefined && value !== null && value !== '') {\\n // URL or not\\n try {\\n url = $tw.ipfs.normalizeUrl(value)\\n } catch (error) {\\n // Ignore\\n }\\n // Process\\n if (url !== undefined && url !== null) {\\n const { cid } = $tw.ipfs.decodeCid(url.pathname)\\n // Request to unpin\\n if ($tw.utils.getIpfsUnpin() && cid !== null) {\\n $tw.ipfs.requestToUnpin(cid)\\n }\\n }\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n }\\n return tiddler\\n }\\n\\n IpfsTiddler.prototype.handleFileImport = function (tiddler) {\\n // Update tiddler\\n const addition = $tw.wiki.getModificationFields()\\n addition.title = tiddler.fields.title\\n addition.tags = (tiddler.fields.tags || []).slice(0)\\n // Add isAttachment tag\\n if (addition.tags.indexOf('$:/isAttachment') === -1) {\\n $tw.utils.pushTop(addition.tags, '$:/isAttachment')\\n }\\n // Add isEmbedded tag\\n if (addition.tags.indexOf('$:/isEmbedded') === -1) {\\n $tw.utils.pushTop(addition.tags, '$:/isEmbedded')\\n }\\n return new $tw.Tiddler(tiddler, addition)\\n }\\n\\n IpfsTiddler.prototype.handleRefreshTiddler = function (event) {\\n const self = this\\n const title = event.tiddlerTitle\\n const tiddler = $tw.wiki.getTiddler(title)\\n const { type, info } = $tw.utils.getContentType(title, tiddler.fields.type)\\n var canonicalUri = tiddler.getFieldString('_canonical_uri')\\n canonicalUri =\\n canonicalUri === undefined ||\\n canonicalUri == null ||\\n canonicalUri.trim() === ''\\n ? null\\n : canonicalUri.trim()\\n var importUri = tiddler.getFieldString('_import_uri')\\n importUri =\\n importUri === undefined || importUri == null || importUri.trim() === ''\\n ? null\\n : importUri.trim()\\n // Reload Attachment\\n if (\\n (info.encoding === 'base64' || type === 'image/svg+xml') &&\\n canonicalUri !== null &&\\n importUri == null\\n ) {\\n const updatedTiddler = $tw.utils.updateTiddler({\\n tiddler: tiddler,\\n fields: [{ key: 'text', value: '' }]\\n })\\n $tw.wiki.addTiddler(updatedTiddler)\\n return true\\n }\\n // Async Import\\n if (canonicalUri !== null || importUri !== null) {\\n var ipfsImport = new IpfsImport()\\n ipfsImport.import(canonicalUri, importUri, tiddler).catch(error => {\\n self.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n })\\n } else {\\n $tw.wiki.clearCache(title)\\n const changedTiddler = $tw.utils.getChangedTiddler(title)\\n $tw.rootWidget.refresh(changedTiddler)\\n }\\n return true\\n }\\n\\n IpfsTiddler.prototype.handleSaveTiddler = async function (tiddler) {\\n // Previous tiddler\\n const oldTiddler = $tw.wiki.getTiddler(tiddler.fields.title)\\n const { type, info } = $tw.utils.getContentType(\\n tiddler.fields.title,\\n tiddler.fields.type\\n )\\n // Prepare\\n var updatedTiddler = new $tw.Tiddler(tiddler)\\n // Process deleted fields\\n if (oldTiddler !== undefined && oldTiddler !== null) {\\n for (var field in oldTiddler.fields) {\\n // Not a reserved keyword\\n if (reservedFields.indexOf(field) !== -1) {\\n continue\\n }\\n // Updated\\n const discard = tiddler.fields[field]\\n if (\\n discard !== undefined &&\\n discard !== null &&\\n tiddler.getFieldString(field) !== undefined\\n ) {\\n continue\\n }\\n // Process\\n var oldCid = null\\n var oldIpnsKey = null\\n var oldNormalizedUrl = null\\n var oldResolvedUrl = null\\n var oldValue = oldTiddler.getFieldString(field)\\n try {\\n var {\\n cid: oldCid,\\n ipnsKey: oldIpnsKey,\\n normalizedUrl: oldNormalizedUrl,\\n resolvedUrl: oldResolvedUrl\\n } = await $tw.ipfs.resolveUrl(false, true, oldValue)\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return tiddler\\n }\\n oldResolvedUrl =\\n oldResolvedUrl === undefined ||\\n oldResolvedUrl == null ||\\n oldResolvedUrl.toString().trim() === ''\\n ? null\\n : oldResolvedUrl.toString().trim()\\n if (oldResolvedUrl !== null && field === '_canonical_uri') {\\n var content = tiddler.getFieldString('text')\\n // Attachment\\n if (info.encoding === 'base64' || type === 'image/svg+xml') {\\n // Embed\\n try {\\n if (info.encoding === 'base64') {\\n content = await $tw.ipfs.loadToBase64(oldResolvedUrl)\\n } else {\\n content = await $tw.ipfs.loadToUtf8(oldResolvedUrl)\\n }\\n updatedTiddler = $tw.utils.updateTiddler({\\n tiddler: updatedTiddler,\\n addTags: ['$:/isAttachment', '$:/isEmbedded'],\\n fields: [{ key: 'text', value: content.data }]\\n })\\n this.getLogger().info(\\n `Embed attachment: ${content.data.length} bytes\\\\n ${oldResolvedUrl}`\\n )\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return tiddler\\n }\\n }\\n }\\n $tw.ipfs.requestToUnpin(oldCid, oldIpnsKey, oldNormalizedUrl)\\n }\\n }\\n var canonicalUri = null\\n var exportUri = null\\n var importUri = null\\n var canonicalCid = null\\n var exportCid = null\\n var importCid = null\\n // Process new and updated fields\\n for (var field in tiddler.fields) {\\n // Not a reserved keyword\\n if (reservedFields.indexOf(field) !== -1) {\\n continue\\n }\\n // Process\\n var cid = null\\n var ipnsKey = null\\n var normalizedUrl = null\\n var resolvedUrl = null\\n var value = tiddler.getFieldString(field)\\n try {\\n var {\\n cid,\\n ipnsKey,\\n normalizedUrl,\\n resolvedUrl\\n } = await $tw.ipfs.resolveUrl(false, true, value)\\n } catch (error) {\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n return tiddler\\n }\\n // Store\\n resolvedUrl =\\n resolvedUrl === undefined ||\\n resolvedUrl == null ||\\n resolvedUrl.toString().trim() === ''\\n ? null\\n : resolvedUrl.toString().trim()\\n if (field === '_canonical_uri') {\\n canonicalUri = resolvedUrl\\n canonicalCid = cid\\n }\\n if (field === '_import_uri') {\\n importUri = resolvedUrl\\n importCid = cid\\n }\\n if (field === '_export_uri') {\\n exportUri = resolvedUrl\\n exportCid = cid\\n }\\n // Previous values if any\\n var oldValue = null\\n if (oldTiddler !== undefined && oldTiddler !== null) {\\n oldValue = oldTiddler.getFieldString(field)\\n }\\n // Process new or updated\\n if (value === oldValue) {\\n continue\\n }\\n var oldCid = null\\n var oldIpnsKey = null\\n var oldNormalizedUrl = null\\n try {\\n var {\\n cid: oldCid,\\n ipnsKey: oldIpnsKey,\\n normalizedUrl: oldNormalizedUrl\\n } = await $tw.ipfs.resolveUrl(false, true, oldValue)\\n } catch (error) {\\n // We cannot resolve the previous value\\n this.getLogger().error(error)\\n $tw.utils.alert(name, error.message)\\n }\\n // Process _canonical_uri\\n if (field === '_canonical_uri') {\\n updatedTiddler = $tw.utils.updateTiddler({\\n tiddler: updatedTiddler,\\n fields: [{ key: 'text', value: '' }]\\n })\\n }\\n $tw.ipfs.requestToPin(cid, ipnsKey, normalizedUrl)\\n $tw.ipfs.requestToUnpin(oldCid, oldIpnsKey, oldNormalizedUrl)\\n }\\n // Tag management\\n var addTags = []\\n var removeTags = []\\n if (canonicalUri == null && exportUri == null && importUri == null) {\\n removeTags.push('$:/isExported', '$:/isImported', '$:/isIpfs')\\n }\\n if (canonicalCid == null && exportCid == null && importCid == null) {\\n if (removeTags.indexOf('$:/isIpfs') === -1) {\\n removeTags.push('$:/isIpfs')\\n }\\n } else {\\n addTags.push('$:/isIpfs')\\n }\\n if (canonicalUri !== null) {\\n // Attachment\\n if (info.encoding === 'base64' || type === 'image/svg+xml') {\\n if (addTags.indexOf('$:/isAttachment') === -1) {\\n addTags.push('$:/isAttachment')\\n }\\n if (removeTags.indexOf('$:/isEmbedded') === -1) {\\n removeTags.push('$:/isEmbedded')\\n }\\n if (importUri !== null) {\\n if (addTags.indexOf('$:/isImported') === -1) {\\n addTags.push('$:/isImported')\\n }\\n } else {\\n if (removeTags.indexOf('$:/isImported') === -1) {\\n removeTags.push('$:/isImported')\\n }\\n }\\n // Others\\n } else {\\n if (removeTags.indexOf('$:/isAttachment') === -1) {\\n removeTags.push('$:/isAttachment')\\n }\\n if (removeTags.indexOf('$:/isEmbedded') === -1) {\\n removeTags.push('$:/isEmbedded')\\n }\\n if (addTags.indexOf('$:/isImported') === -1) {\\n addTags.push('$:/isImported')\\n }\\n }\\n } else {\\n // Attachment\\n if (info.encoding === 'base64' || type === 'image/svg+xml') {\\n if (addTags.indexOf('$:/isAttachment') === -1) {\\n addTags.push('$:/isAttachment')\\n }\\n if (addTags.indexOf('$:/isEmbedded') === -1) {\\n addTags.push('$:/isEmbedded')\\n }\\n // Others\\n } else {\\n if (removeTags.indexOf('$:/isAttachment') === -1) {\\n removeTags.push('$:/isAttachment')\\n }\\n if (removeTags.indexOf('$:/isEmbedded') === -1) {\\n removeTags.push('$:/isEmbedded')\\n }\\n }\\n if (importUri !== null) {\\n if (addTags.indexOf('$:/isImported') === -1) {\\n addTags.push('$:/isImported')\\n }\\n } else {\\n if (removeTags.indexOf('$:/isImported') === -1) {\\n removeTags.push('$:/isImported')\\n }\\n }\\n }\\n if (exportUri !== null) {\\n if (addTags.indexOf('$:/isExported') === -1) {\\n addTags.push('$:/isExported')\\n }\\n } else {\\n if (removeTags.indexOf('$:/isExported') === -1) {\\n removeTags.push('$:/isExported')\\n }\\n }\\n if (addTags.length > 0 || removeTags.length > 0) {\\n updatedTiddler = $tw.utils.updateTiddler({\\n tiddler: updatedTiddler,\\n addTags: addTags,\\n removeTags: removeTags\\n })\\n }\\n $tw.wiki.addTiddler(updatedTiddler)\\n return updatedTiddler\\n }\\n\\n exports.IpfsTiddler = IpfsTiddler\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"library\"\n },\n \"$:/plugins/ipfs/ipfs-utils.js\": {\n \"title\": \"$:/plugins/ipfs/ipfs-utils.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/ipfs-utils.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: utils\\n\\nIPFS utils\\n\\n\\\\*/\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n /**\\n * $:/core/modules/utils/logger.js\\n *\\n * TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n *\\n * Copyright (c) 2004-2007, Jeremy Ruston\\n * Copyright (c) 2007-2018, UnaMesa Association\\n * Copyright (c) 2019-2020, Blue Light\\n * All rights reserved.\\n *\\n * Redistribution and use in source and binary forms, with or without\\n * modification, are permitted provided that the following conditions are met:\\n *\\n * * Redistributions of source code must retain the above copyright notice, this\\n * list of conditions and the following disclaimer.\\n *\\n * * Redistributions in binary form must reproduce the above copyright notice,\\n * this list of conditions and the following disclaimer in the documentation\\n * and/or other materials provided with the distribution.\\n *\\n * * Neither the name of the copyright holder nor the names of its\\n * contributors may be used to endorse or promote products derived from\\n * this software without specific prior written permission.\\n *\\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n */\\n\\n /*\\n * from $:/core/modules/utils/logger.js\\n **/\\n exports.alert = function (callee, text) {\\n if (\\n typeof window === 'undefined' ||\\n typeof window.navigator === 'undefined'\\n ) {\\n return\\n }\\n const ALERT_TAG = '$:/tags/Alert'\\n // Prepare the text of the alert\\n // var text = Array.prototype.join.call(arguments,\\\" \\\");\\n // Check if there is an existing alert with the same text and the same component\\n var existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG)\\n var alertFields\\n var existingCount\\n var self = this\\n $tw.utils.each(existingAlerts, function (title) {\\n var tiddler = $tw.wiki.getTiddler(title)\\n if (\\n tiddler.fields.text === text &&\\n tiddler.fields.component === self.componentName &&\\n tiddler.fields.modified &&\\n (!alertFields || tiddler.fields.modified \u003C alertFields.modified)\\n ) {\\n alertFields = $tw.utils.extend({}, tiddler.fields)\\n }\\n })\\n if (alertFields) {\\n existingCount = alertFields.count || 1\\n } else {\\n alertFields = {\\n title: $tw.wiki.generateNewTitle('$:/temp/alerts/alert', {\\n prefix: ''\\n }),\\n text: text,\\n tags: [ALERT_TAG],\\n component: callee\\n }\\n existingCount = 0\\n }\\n alertFields.modified = new Date()\\n if (++existingCount > 1) {\\n alertFields.count = existingCount\\n } else {\\n alertFields.count = undefined\\n }\\n $tw.wiki.addTiddler(new $tw.Tiddler(alertFields))\\n }\\n\\n exports.getChangedTiddler = function (object) {\\n // Holder\\n const changedTiddler = Object.create(null)\\n // Check\\n if (object === undefined || object == null) {\\n return changedTiddler\\n }\\n if (object instanceof $tw.Tiddler === false && typeof object !== 'string') {\\n return changedTiddler\\n }\\n // Retrieve title\\n var title = null\\n if (typeof object === 'string') {\\n title = object\\n }\\n if (object instanceof $tw.Tiddler) {\\n title = object.getFieldString('title')\\n }\\n // Check\\n if (title === undefined || title == null) {\\n return changedTiddler\\n }\\n // Process title\\n changedTiddler[title] = Object.create(null)\\n // Done\\n return changedTiddler\\n }\\n\\n exports.updateTiddler = function (updates) {\\n // Is there anything to do\\n if (\\n updates === undefined ||\\n updates == null ||\\n updates.tiddler === undefined ||\\n updates.tiddler == null\\n ) {\\n return null\\n }\\n // Prepare updates\\n const fields = $tw.wiki.getModificationFields()\\n // Tags\\n fields.tags = (updates.tiddler.fields.tags || []).slice(0)\\n // Process add tags\\n if (\\n updates.addTags !== undefined &&\\n updates.addTags !== null &&\\n Array.isArray(updates.addTags)\\n ) {\\n for (var i = 0; i \u003C updates.addTags.length; i++) {\\n const tag = updates.addTags[i]\\n if (fields.tags.indexOf(tag) === -1) {\\n $tw.utils.pushTop(fields.tags, tag)\\n }\\n }\\n }\\n // Process remove tags\\n if (\\n updates.removeTags !== undefined &&\\n updates.removeTags !== null &&\\n Array.isArray(updates.removeTags)\\n ) {\\n for (var i = 0; i \u003C updates.removeTags.length; i++) {\\n const tag = updates.removeTags[i]\\n const index = fields.tags.indexOf(tag)\\n if (index !== -1) {\\n fields.tags.splice(index, 1)\\n }\\n }\\n }\\n // Process fields\\n if (\\n updates.fields !== undefined &&\\n updates.fields !== null &&\\n Array.isArray(updates.fields)\\n ) {\\n for (var i = 0; i \u003C updates.fields.length; i++) {\\n const field = updates.fields[i]\\n if (field.key !== undefined && field.key !== null) {\\n fields[field.key] = field.value\\n }\\n }\\n }\\n // Update tiddler\\n return new $tw.Tiddler(updates.tiddler, fields)\\n }\\n\\n exports.getContentType = function (title, type) {\\n type =\\n type === undefined || type == null || type.trim() === ''\\n ? null\\n : type.trim()\\n if (type == null) {\\n type = 'text/vnd.tiddlywiki'\\n }\\n var info = $tw.config.contentTypeInfo[type]\\n if (info === undefined || info == null) {\\n const url = $tw.ipfs.getDocumentUrl()\\n url.hash = title\\n this.getLogger().info(\\n `Unknown Content-Type: \\\"${type}\\\", default: \\\"text/vnd.tiddlywiki\\\":\\\\n ${url}`\\n )\\n type = 'text/vnd.tiddlywiki'\\n info = $tw.config.contentTypeInfo[type]\\n }\\n return {\\n type: type,\\n info: info\\n }\\n }\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"utils\"\n },\n \"$:/plugins/ipfs/ipfs-wrapper.js\": {\n \"title\": \"$:/plugins/ipfs/ipfs-wrapper.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/ipfs/ipfs-wrapper.js\\ntype: application/javascript\\ntags: $:/ipfs/core\\nmodule-type: library\\n\\nIPFS Wrapper\\n\\n\\\\*/\\n\\n;(function () {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n 'use strict'\\n\\n /**\\n * https://github.com/purposeindustries/window-or-global\\n * The MIT License (MIT) Copyright (c) Purpose Industries\\n * version: 1.0.1\\n */\\n const root =\\n (typeof self === 'object' && self.self === self && self) ||\\n (typeof global === 'object' && global.global === global && global) ||\\n this\\n\\n const ipfsKeyword = 'ipfs'\\n const ipnsKeyword = 'ipns'\\n\\n const name = 'ipfs-wrapper'\\n\\n var IpfsWrapper = function (ipfsBundle) {\\n this.ipfsBundle = ipfsBundle\\n this.ipfsLibrary = ipfsBundle.ipfsLibrary\\n this.ipfsUrl = ipfsBundle.ipfsUrl\\n }\\n\\n IpfsWrapper.prototype.getLogger = function () {\\n return root.log.getLogger(name)\\n }\\n\\n IpfsWrapper.prototype.getWindowIpfsClient = async function () {\\n // IPFS Companion\\n try {\\n const policy = await this.ipfsLibrary.getWindowIpfs()\\n if (policy !== null && policy.ipfs !== null && policy.provider !== null) {\\n return policy\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n throw new Error('Failed to retrieve IPFS Companion...')\\n }\\n\\n IpfsWrapper.prototype.getHttpIpfsClient = async function (url) {\\n // HTTP Client\\n try {\\n const policy = await this.ipfsLibrary.getHttpIpfs(url)\\n if (policy !== null && policy.ipfs !== null && policy.provider !== null) {\\n return policy\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n throw new Error('Failed to retrieve an IPFS HTTP provider...')\\n }\\n\\n IpfsWrapper.prototype.getIpfsClient = async function (url) {\\n // IPFS client\\n try {\\n var policy = null\\n const ipfsProvider = $tw.utils.getIpfsProvider()\\n if (ipfsProvider === 'window') {\\n policy = await this.ipfsLibrary.getWindowIpfs()\\n } else if (ipfsProvider === 'http') {\\n policy = await this.ipfsLibrary.getHttpIpfs(url)\\n } else {\\n policy = await this.ipfsLibrary.getDefaultIpfs(url)\\n }\\n if (policy !== null && policy.ipfs !== null && policy.provider !== null) {\\n return policy\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n throw new Error('Failed to retrieve an IPFS provider...')\\n }\\n\\n IpfsWrapper.prototype.getIpnsIdentifiers = async function (\\n ipfs,\\n identifier,\\n ipnsName\\n ) {\\n identifier =\\n identifier === undefined || identifier == null || identifier.trim() === ''\\n ? null\\n : identifier.trim()\\n ipnsName =\\n ipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n ? null\\n : ipnsName.trim()\\n if (identifier == null && ipnsName == null) {\\n throw new Error('Undefined IPNS identifiers...')\\n }\\n var found = false\\n var ipnsKey = null\\n var keys = null\\n var normalizedUrl = null\\n try {\\n // Only the server who generates the key has the knowledge\\n keys = await this.getIpnsKeys(ipfs)\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n // Do our best\\n if (ipnsName !== null && identifier !== null) {\\n if (keys !== null && keys !== undefined && Array.isArray(keys)) {\\n for (var index = 0; index \u003C keys.length; index++) {\\n if (keys[index].id === identifier && keys[index].name === ipnsName) {\\n ipnsKey = identifier\\n found = true\\n break\\n }\\n }\\n }\\n } else if (ipnsName !== null) {\\n if (keys !== null && keys !== undefined && Array.isArray(keys)) {\\n for (var index = 0; index \u003C keys.length; index++) {\\n if (keys[index].name === ipnsName) {\\n ipnsKey = keys[index].id\\n found = true\\n break\\n }\\n }\\n }\\n } else {\\n if (keys !== null && keys !== undefined && Array.isArray(keys)) {\\n for (var index = 0; index \u003C keys.length; index++) {\\n if (\\n keys[index].id === identifier ||\\n keys[index].name === identifier\\n ) {\\n ipnsKey = keys[index].id\\n ipnsName = keys[index].name\\n found = true\\n break\\n }\\n }\\n }\\n }\\n if (found === false) {\\n // Unable to resolve the keys, check if identifier is a an IPFS cid\\n if (this.ipfsBundle.isCid(identifier) === false) {\\n throw new Error('Unknown IPNS identifier...')\\n }\\n ipnsKey = identifier\\n }\\n // Lets build an url, the resolver will do the final check, we cannot do more here\\n normalizedUrl = this.ipfsUrl.normalizeUrl(`/${ipnsKeyword}/${ipnsKey}`)\\n if (found) {\\n this.getLogger().info(\\n `Successfully Fetched IPNS identifiers: ${ipnsName}\\\\n ${normalizedUrl}`\\n )\\n } else {\\n this.getLogger().info(\\n `Unable to Fetch IPNS identifiers, default to\\\\n ${normalizedUrl}`\\n )\\n }\\n return {\\n ipnsKey: ipnsKey,\\n ipnsName: ipnsName,\\n normalizedUrl: normalizedUrl\\n }\\n }\\n\\n IpfsWrapper.prototype.generateIpnsKey = async function (ipfs, ipnsName) {\\n try {\\n const key = await this.ipfsLibrary.genKey(ipfs, ipnsName)\\n const url = this.ipfsUrl.normalizeUrl(`/${ipnsKeyword}/${key}`)\\n this.getLogger().info(\\n `Successfully generated IPNS key with IPNS name: ${ipnsName}\\\\n ${url}`\\n )\\n return key\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n throw new Error('Failed to generate and IPNS key...')\\n }\\n\\n IpfsWrapper.prototype.removeIpnsKey = async function (ipfs, ipnsName) {\\n try {\\n const hash = await this.ipfsLibrary.rmKey(ipfs, ipnsName)\\n this.getLogger().info(`Successfully removed IPNS name: ${ipnsName}`)\\n return hash\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n throw new Error('Failed to remove an IPNS Key...')\\n }\\n\\n IpfsWrapper.prototype.renameIpnsName = async function (\\n ipfs,\\n oldIpnsName,\\n newIpnsName\\n ) {\\n try {\\n const { id: key, was, now } = await this.ipfsLibrary.renameKey(\\n ipfs,\\n oldIpnsName,\\n newIpnsName\\n )\\n this.getLogger().info(\\n `Successfully renamed IPNS name: ${was} with ${now}`\\n )\\n return {\\n ipnsKey: key,\\n ipnsName: now\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n throw new Error('Failed to rename an IPNS name...')\\n }\\n\\n IpfsWrapper.prototype.getIpnsKeys = async function (ipfs) {\\n try {\\n const keys = await this.ipfsLibrary.getKeys(ipfs)\\n this.getLogger().info('Successfully fetched IPNS keys...')\\n return keys\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n throw new Error('Failed to fetch IPNS keys...')\\n }\\n\\n IpfsWrapper.prototype.fetchFromIpfs = async function (ipfs, cid) {\\n cid =\\n cid === undefined || cid == null || cid.toString().trim() === ''\\n ? null\\n : cid.toString().trim()\\n if (cid == null) {\\n throw new Error('Undefined IPNS identifier...')\\n }\\n const pathname = `/${ipfsKeyword}/${cid}`\\n try {\\n const fetched = await this.ipfsLibrary.cat(ipfs, pathname)\\n const url = this.ipfsUrl.normalizeUrl(pathname)\\n this.getLogger().info(`Successfully fetched:\\\\n ${url}`)\\n return fetched\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n throw new Error('Failed to fetch from IPFS...')\\n }\\n\\n IpfsWrapper.prototype.addToIpfs = async function (ipfs, content) {\\n try {\\n const { hash, size } = await this.ipfsLibrary.add(ipfs, content)\\n const pathname = '/' + ipfsKeyword + '/' + hash\\n const url = this.ipfsUrl.normalizeUrl(pathname)\\n this.getLogger().info(`Successfully added ${size} bytes:\\\\n ${url}`)\\n return {\\n added: hash,\\n size: size\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n throw new Error('Failed to add content to IPFS...')\\n }\\n\\n IpfsWrapper.prototype.resolveIpnsKey = async function (ipfs, ipnsKey) {\\n ipnsKey =\\n ipnsKey === undefined || ipnsKey == null || ipnsKey.trim() === ''\\n ? null\\n : ipnsKey.trim()\\n if (ipnsKey == null) {\\n throw new Error('Undefined IPNS key...')\\n }\\n const pathname = `/${ipnsKeyword}/${ipnsKey}`\\n try {\\n const url = this.ipfsUrl.normalizeUrl(pathname)\\n const resolved = await this.ipfsLibrary.resolve(ipfs, pathname)\\n const { cid } = this.ipfsBundle.decodeCid(resolved)\\n if (cid !== null) {\\n const parsed = this.ipfsUrl.normalizeUrl(resolved)\\n this.getLogger().info(\\n `Successfully resolved IPNS key:\\\\n ${url} \\\\n ${parsed}`\\n )\\n return cid\\n }\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n throw new Error('Failed to resolve an IPNS key...')\\n }\\n\\n IpfsWrapper.prototype.publishIpnsName = async function (\\n cid,\\n ipfs,\\n ipnsKey,\\n ipnsName\\n ) {\\n ipnsKey =\\n ipnsKey === undefined || ipnsKey == null || ipnsKey.trim() === ''\\n ? null\\n : ipnsKey.trim()\\n if (ipnsKey == null) {\\n throw new Error('Undefined IPNS key...')\\n }\\n ipnsName =\\n ipnsName === undefined || ipnsName == null || ipnsName.trim() === ''\\n ? null\\n : ipnsName.trim()\\n if (ipnsName == null) {\\n throw new Error('Undefined IPNS name...')\\n }\\n cid =\\n cid === undefined || cid == null || cid.toString().trim() === ''\\n ? null\\n : cid.toString().trim()\\n if (cid == null) {\\n throw new Error('Undefined IPNS identifier...')\\n }\\n // Path\\n const key = `/${ipnsKeyword}/${ipnsKey}`\\n const pathname = `/${ipfsKeyword}/${cid}`\\n try {\\n // Publish\\n const result = await this.ipfsLibrary.publish(ipfs, ipnsName, pathname)\\n const keyParsed = this.ipfsUrl.normalizeUrl(key)\\n const url = this.ipfsUrl.normalizeUrl(pathname)\\n this.getLogger().info(\\n `Successfully published IPNS name: ${ipnsName}\\\\n ${keyParsed}\\\\n ${url}`\\n )\\n return result\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n throw new Error('Failed to publish an IPNS name...')\\n }\\n\\n IpfsWrapper.prototype.pinToIpfs = async function (ipfs, cid) {\\n cid =\\n cid === undefined || cid == null || cid.toString().trim() === ''\\n ? null\\n : cid.toString().trim()\\n if (cid == null) {\\n throw new Error('Undefined IPNS identifier...')\\n }\\n const pathname = `/${ipfsKeyword}/${cid}`\\n try {\\n const pinned = await this.ipfsLibrary.pin(ipfs, pathname)\\n const url = this.ipfsUrl.normalizeUrl(pathname)\\n this.getLogger().info(`Successfully pinned:\\\\n ${url}`)\\n return pinned\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n throw new Error('Failed to pin to IPFS...')\\n }\\n\\n IpfsWrapper.prototype.unpinFromIpfs = async function (ipfs, cid) {\\n cid =\\n cid === undefined || cid == null || cid.toString().trim() === ''\\n ? null\\n : cid.toString().trim()\\n if (cid == null) {\\n throw new Error('Undefined IPNS identifier...')\\n }\\n const pathname = `/${ipfsKeyword}/${cid}`\\n try {\\n const unpinned = await this.ipfsLibrary.unpin(ipfs, pathname)\\n const url = this.ipfsUrl.normalizeUrl(pathname)\\n this.getLogger().info(`Successfully unpinned:\\\\n ${url}`)\\n return unpinned\\n } catch (error) {\\n this.getLogger().error(error)\\n }\\n throw new Error('Failed to unpin from IPFS...')\\n }\\n\\n exports.IpfsWrapper = IpfsWrapper\\n})()\\n\",\n \"type\": \"application/javascript\",\n \"tags\": \"$:/ipfs/core\",\n \"module-type\": \"library\"\n },\n \"$:/language/Buttons/Ipfs/Export/Caption\": {\n \"title\": \"$:/language/Buttons/Ipfs/Export/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"export to IPFS\"\n },\n \"$:/language/Buttons/Ipfs/Export/Hint\": {\n \"title\": \"$:/language/Buttons/Ipfs/Export/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Export this tiddler to IPFS\"\n },\n \"$:/language/Buttons/Ipfs/Export/Attachment/Caption\": {\n \"title\": \"$:/language/Buttons/Ipfs/Export/Attachment/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"export attachment to IPFS\"\n },\n \"$:/language/Buttons/Ipfs/Export/Attachment/Hint\": {\n \"title\": \"$:/language/Buttons/Ipfs/Export/Attachment/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Export attachment to IPFS\"\n },\n \"$:/language/Buttons/Ipfs/Export/Content/Caption\": {\n \"title\": \"$:/language/Buttons/Ipfs/Export/Content/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"export content to IPFS\"\n },\n \"$:/language/Buttons/Ipfs/Export/Content/Hint\": {\n \"title\": \"$:/language/Buttons/Ipfs/Export/Content/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Export this tiddler content to IPFS\"\n },\n \"$:/language/Buttons/Ipns/Fetch/Caption\": {\n \"title\": \"$:/language/Buttons/Ipns/Fetch/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"fetch from IPNS\"\n },\n \"$:/language/Buttons/Ipns/Fetch/Hint\": {\n \"title\": \"$:/language/Buttons/Ipns/Fetch/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Fetch IPNS key\"\n },\n \"$:/language/Buttons/Ipns/Generate/Caption\": {\n \"title\": \"$:/language/Buttons/Ipns/Generate/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"generate IPNS\"\n },\n \"$:/language/Buttons/Ipns/Generate/Hint\": {\n \"title\": \"$:/language/Buttons/Ipns/Generate/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Generate IPNS key\"\n },\n \"$:/language/Buttons/Ipfs/Refresh/Caption\": {\n \"title\": \"$:/language/Buttons/Ipfs/Refresh/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"refresh\"\n },\n \"$:/language/Buttons/Ipfs/Refresh/Hint\": {\n \"title\": \"$:/language/Buttons/Ipfs/Refresh/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Perform a full refresh of the tiddler\"\n },\n \"$:/language/Buttons/Ipfs/Pin/Caption\": {\n \"title\": \"$:/language/Buttons/Ipfs/Pin/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"pin to IPFS\"\n },\n \"$:/language/Buttons/Ipfs/Pin/Hint\": {\n \"title\": \"$:/language/Buttons/Ipfs/Pin/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Pin this wiki to IPFS\"\n },\n \"$:/language/Buttons/Ipfs/Tiddler/Pin/Caption\": {\n \"title\": \"$:/language/Buttons/Ipfs/Tiddler/Pin/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"pin to IPFS\"\n },\n \"$:/language/Buttons/Ipfs/Tiddler/Pin/Hint\": {\n \"title\": \"$:/language/Buttons/Ipfs/Tiddler/Pin/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Pin tiddler resources to IPFS\"\n },\n \"$:/language/Buttons/Ipfs/Tiddler/Unpin/Caption\": {\n \"title\": \"$:/language/Buttons/Ipfs/Tiddler/Unpin/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"unpin from IPFS\"\n },\n \"$:/language/Buttons/Ipfs/Tiddler/Unpin/Hint\": {\n \"title\": \"$:/language/Buttons/Ipfs/Tiddler/Unpin/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Unpin tiddler resources from IPFS\"\n },\n \"$:/language/Buttons/Ipfs/Unpin/Caption\": {\n \"title\": \"$:/language/Buttons/Ipfs/Unpin/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"unpin from IPFS\"\n },\n \"$:/language/Buttons/Ipfs/Unpin/Hint\": {\n \"title\": \"$:/language/Buttons/Ipfs/Unpin/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Unpin this wiki from IPFS\"\n },\n \"$:/language/Buttons/Console/Mobile/Caption\": {\n \"title\": \"$:/language/Buttons/Console/Mobile/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"mobile console\"\n },\n \"$:/language/Buttons/Console/Mobile/Hint\": {\n \"title\": \"$:/language/Buttons/Console/Mobile/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Load/Unload Mobile Console\"\n },\n \"$:/language/Buttons/Ens/Manager/Open/Caption\": {\n \"title\": \"$:/language/Buttons/Ens/Manager/Open/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"open ENS Manager\"\n },\n \"$:/language/Buttons/Ens/Manager/Open/Hint\": {\n \"title\": \"$:/language/Buttons/Ens/Manager/Open/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Open ENS Domain Manager\"\n },\n \"$:/language/Buttons/Ens/Publish/Caption\": {\n \"title\": \"$:/language/Buttons/Ens/Publish/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"publish to ENS\"\n },\n \"$:/language/Buttons/Ens/Publish/Hint\": {\n \"title\": \"$:/language/Buttons/Ens/Publish/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Publish this wiki to ENS\"\n },\n \"$:/language/Buttons/Ens/Resolve/And/Open/Caption\": {\n \"title\": \"$:/language/Buttons/Ens/Resolve/And/Open/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"open ENS Domain content\"\n },\n \"$:/language/Buttons/Ens/Resolve/And/Open/Hint\": {\n \"title\": \"$:/language/Buttons/Ens/Resolve/And/Open/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Open resolved ENS Domain content\"\n },\n \"$:/language/Buttons/Ipns/Publish/Caption\": {\n \"title\": \"$:/language/Buttons/Ipns/Publish/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"publish to IPNS\"\n },\n \"$:/language/Buttons/Ipns/Publish/Hint\": {\n \"title\": \"$:/language/Buttons/Ipns/Publish/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Publish this wiki to IPNS\"\n },\n \"$:/language/Buttons/Ipns/Remove/Caption\": {\n \"title\": \"$:/language/Buttons/Ipns/Remove/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"remove\"\n },\n \"$:/language/Buttons/Ipns/Remove/Hint\": {\n \"title\": \"$:/language/Buttons/Ipns/Remove/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Remove IPNS name and IPNS key\"\n },\n \"$:/language/Buttons/Ipns/Rename/Caption\": {\n \"title\": \"$:/language/Buttons/Ipns/Rename/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"rename\"\n },\n \"$:/language/Buttons/Ipns/Rename/Hint\": {\n \"title\": \"$:/language/Buttons/Ipns/Rename/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Rename IPNS name\"\n },\n \"$:/language/Buttons/Ipns/Resolve/And/Open/Caption\": {\n \"title\": \"$:/language/Buttons/Ipns/Resolve/And/Open/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"resolve and open\"\n },\n \"$:/language/Buttons/Ipns/Resolve/And/Open/Hint\": {\n \"title\": \"$:/language/Buttons/Ipns/Resolve/And/Open/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Open resolved IPNS key\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Caption\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"IPFS Saver\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"These settings are only used when saving to IPFS.\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Verbose\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Verbose\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Saver Verbose\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Url\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Url\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"IPFS Server URL\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/ApiUrl\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/ApiUrl\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"API\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/GatewayUrl\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/GatewayUrl\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Gateway\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Ens\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Ens\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"ENS\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/EnsDomain\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/EnsDomain\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"ENS domain\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Ipns\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Ipns\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"IPNS\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/IpnsName\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/IpnsName\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"IPNS name\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/IpnsKey\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/IpnsKey\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"IPNS key\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Resolved\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Resolved\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Resolved\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Global\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Global\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Global\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Verbose/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Verbose/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Verbose\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Unpin/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Unpin/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Unpin previous content\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Wait/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Wait/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Wait\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Policy\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Policy\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Relative URL Policy\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Policy/Origin/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Policy/Origin/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Origin\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Policy/Gateway/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Policy/Gateway/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Gateway\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Protocol\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Protocol\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Protocol\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Protocol/Ens/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Protocol/Ens/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"ENS\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Protocol/Ipfs/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Protocol/Ipfs/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"IPFS\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Protocol/Ipns/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Protocol/Ipns/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"IPNS\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Export\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Export\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Export\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Export/Static/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Export/Static/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Static\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Export/Json/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Export/Json/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"JSON\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Export/Tid/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Export/Tid/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"TID\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Provider\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Provider\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"IPFS Provider\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Provider/Default/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Provider/Default/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Default\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Provider/Window/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Provider/Window/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"IPFS Companion\"\n },\n \"$:/language/ControlPanel/Saving/IpfsService/Provider/HTTP/Description\": {\n \"title\": \"$:/language/ControlPanel/Saving/IpfsService/Provider/HTTP/Description\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"HTTP Client\"\n },\n \"$:/language/ControlPanel/Basics/Version/Prompt\": {\n \"title\": \"$:/language/ControlPanel/Basics/Version/Prompt\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"\u003Cb>~TiddlyWiki\u003C/b>:\"\n },\n \"$:/language/ControlPanel/Ipfs/Version/Prompt\": {\n \"title\": \"$:/language/ControlPanel/Ipfs/Version/Prompt\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"\u003Cb>IPFS\u003C/b>:\"\n },\n \"$:/language/ControlPanel/Settings/PreferredSaver/Caption\": {\n \"title\": \"$:/language/ControlPanel/Settings/PreferredSaver/Caption\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Preferred Saver\"\n },\n \"$:/language/ControlPanel/Appearance/Hint\": {\n \"title\": \"$:/language/ControlPanel/Appearance/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Ways to customise the appearance of your \u003Cb>~TiddlyWiki\u003C/b>.\"\n },\n \"$:/language/ControlPanel/Info/Hint\": {\n \"title\": \"$:/language/ControlPanel/Info/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Information about this \u003Cb>~TiddlyWiki\u003C/b>\"\n },\n \"$:/language/ControlPanel/Saving/Hint\": {\n \"title\": \"$:/language/ControlPanel/Saving/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"Settings used for saving the entire \u003Cb>~TiddlyWiki\u003C/b> as a single file via a saver module.\"\n },\n \"$:/language/ControlPanel/Settings/Hint\": {\n \"title\": \"$:/language/ControlPanel/Settings/Hint\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"text\": \"These settings let you customise the behaviour of \u003Cb>~TiddlyWiki\u003C/b>.\"\n },\n \"$:/language/EditTemplate/Body/External/Hint\": {\n \"title\": \"$:/language/EditTemplate/Body/External/Hint\",\n \"modified\": \"20200528094915385\",\n \"text\": \"This tiddler shows content stored outside of the main ~TiddlyWiki file.\u003Cbr/>You can edit the tags and fields but cannot directly edit the content itself\"\n },\n \"$:/language/NetworkError/XMLHttpRequest\": {\n \"title\": \"$:/language/NetworkError/XMLHttpRequest\",\n \"modified\": \"20200528094915385\",\n \"text\": \"Network Error while loading...\"\n },\n \"$:/language/LazyLoadingWarning\": {\n \"title\": \"$:/language/LazyLoadingWarning\",\n \"modified\": \"20200528094915385\",\n \"text\": \"\u003Cp>Trying to load external Tiddler content from:\u003Cp>\u003C/p>''\u003C$ipfslink field=\\\"_canonical_uri\\\" tiddler=\u003C\u003CcurrentTiddler>>/>''\u003C/p>\"\n },\n \"$:/language/EmptyTidddler\": {\n \"title\": \"$:/language/EmptyTidddler\",\n \"modified\": \"20200528094915385\",\n \"text\": \"\u003Cp>An external Tiddler content has been loaded:\u003C/p>\u003Cp>''\u003C$ipfslink field=\\\"_canonical_uri\\\" tiddler=\u003C\u003CcurrentTiddler>>/>''\u003C/p>\u003Cp>The imported Tiddler content is empty, possible reasons:\u003C/p>\u003Cul>\u003Cli>The Tiddler Content Type doesn't match the type of the external content.\u003C/li>\"\n },\n \"$:/plugins/ipfs/changelog\": {\n \"title\": \"$:/plugins/ipfs/changelog\",\n \"modified\": \"20200525094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"!! v0.3.0\\n\\n[[See GitHub for detailed change history of this release|https://github.com/xmaysonnave/tiddlywiki-ipfs/compare/v0.2.9...v0.3.0]]\\n\\n!! v0.2.9\\n\\n[[See GitHub for detailed change history of this release|https://github.com/xmaysonnave/tiddlywiki-ipfs/compare/v0.2.8...v0.2.9]]\\n\\n!! v0.2.8\\n\\n[[See GitHub for detailed change history of this release|https://github.com/xmaysonnave/tiddlywiki-ipfs/compare/v0.2.7...v0.2.8]]\\n\\n...\\n\\n!! 0.2.2\\n\\n* First public release\"\n },\n \"$:/plugins/ipfs/readme\": {\n \"title\": \"$:/plugins/ipfs/readme\",\n \"modified\": \"20200525094915385\",\n \"tags\": \"$:/ipfs/core\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"!! IPFS with ~TiddlyWiki\\n\\nFeatures:\\n\\n* Store `TiddlyWiki's` and attachments on [ext[IPFS|https://ipfs.io/]]\\n* Access `TiddlyWiki's` and attachments from [ext[IPFS|https://ipfs.io/]]\\n* Encrypt and Unencrypt `TiddlyWiki` and attachments\\n* Publish and Manage IPNS Keys and Names\\n* Interact with [ext[Metamask|https://metamask.io]] Ethereum wallets\\n* Publish to [ext[ENS|https://ens.domains]]\\n* Share over [ext[IPFS|https://ipfs.io/]] `TiddlyWiki's` [ext[Tiddlers|https://tiddlywiki.com/#Tiddlers]] and attachments\\n\\nSupported Browsers:\\n\\n* [ext[Firefox|https://www.mozilla.org]]\\n* [ext[Chrome|https://www.google.com/chrome/]]\\n* [ext[Chromium|https://www.chromium.org]]\\n\\nSupported Ethereum browser extension:\\n\\n* [ext[Metamask|https://metamask.io]]\\n\\nSupported Mobile ĐApp browser:\\n\\n* [ext[Metamask|https://metamask.io]]\\n\\nSupported ENS Ethereum Networks\\n\\n* `Mainnet`: Ethereum Main Network\\n* `Ropsten`: Ethereum Test Network (~PoW)\\n* `Rinkeby`: Ethereum Test Network (~PoA)\\n* `Goerli`: Ethereum Test Network (~PoA)\\n\\nResources:\\n\\n* https://github.com/xmaysonnave/tiddlywiki-ipfs/\\n* https://github.com/xmaysonnave/tiddlywiki-ipfs/blob/master/README.md\\n\\n!! With a capable ENS browser:\\n\\n* [ext[IPFS with TiddlyWiki|https://bluelightav.eth]] on \\\"Mainnet: Ethereum Main Network\\\"\\n* [ext[IPFS with TiddlyWiki|https://bluelightav.eth]] on [ext[Rinkeby|https://www.rinkeby.io/]] (~PoA): Ethereum Test Network\\n* [ext[IPFS with TiddlyWiki plugin|https://bluelightav.eth/#%24%3A%2Fplugins%2Fipfs]]\\n* [ext[IPFS with TiddlyWiki Documentation|https://bluelightav.eth/#IPFS%20Documentation]]\\n\\n!! With a non capable ENS browser:\\n\\n* [ext[IPFS with TiddlyWiki|https://bluelightav.eth.link]]\\n* [ext[IPFS with TiddlyWiki plugin|https://bluelightav.eth.link/#%24%3A%2Fplugins%2Fipfs]]\\n* [ext[IPFS with TiddlyWiki Documentation|https://bluelightav.eth.link/#IPFS%20Documentation]]\"\n },\n \"$:/ipfs/saver/api/http/localhost/5001\": {\n \"title\": \"$:/ipfs/saver/api/http/localhost/5001\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/api\",\n \"text\": \"http://127.0.0.1:5001\"\n },\n \"$:/ipfs/saver/api/https/tube.copylaradio.com/5001\": {\n \"title\": \"$:/ipfs/saver/api/https/tube.copylaradio.com/5001\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/api\",\n \"text\": \"https://tube.copylaradio.com:5001\"\n },\n \"$:/ipfs/saver/api/https/ipfs.bluelightav.org\": {\n \"title\": \"$:/ipfs/saver/api/https/ipfs.bluelightav.org\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/api\",\n \"text\": \"https://ipfs.bluelightav.org\"\n },\n \"$:/ipfs/saver/gateway/https/ipfs.busy.org\": {\n \"title\": \"$:/ipfs/saver/gateway/https/ipfs.busy.org\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://ipfs.busy.org\"\n },\n \"$:/ipfs/saver/gateway/https/cloudflare-ipfs.com\": {\n \"title\": \"$:/ipfs/saver/gateway/https/cloudflare-ipfs.com\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://cloudflare-ipfs.com\"\n },\n \"$:/ipfs/saver/gateway/https/ipfs.eternum.io\": {\n \"title\": \"$:/ipfs/saver/gateway/https/ipfs.eternum.io\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://ipfs.eternum.io\"\n },\n \"$:/ipfs/saver/gateway/https/gateway.bluelightav.org\": {\n \"title\": \"$:/ipfs/saver/gateway/https/gateway.bluelightav.org\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://gateway.bluelightav.org\"\n },\n \"$:/ipfs/saver/gateway/https/gateway.ipfs.io\": {\n \"title\": \"$:/ipfs/saver/gateway/https/gateway.ipfs.io\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://gateway.ipfs.io\"\n },\n \"$:/ipfs/saver/gateway/https/ipfs.greyh.at\": {\n \"title\": \"$:/ipfs/saver/gateway/https/ipfs.greyh.at\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://ipfs.greyh.at\"\n },\n \"$:/ipfs/saver/gateway/https/hardbin.com\": {\n \"title\": \"$:/ipfs/saver/gateway/https/hardbin.com\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://hardbin.com\"\n },\n \"$:/ipfs/saver/gateway/http/localhost\": {\n \"title\": \"$:/ipfs/saver/gateway/http/localhost\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"http://127.0.0.1:8080\"\n },\n \"$:/ipfs/saver/gateway/https/tube.copylaradio.com\": {\n \"title\": \"$:/ipfs/saver/gateway/https/tube.copylaradio.com\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://tube.copylaradio.com\"\n },\n \"$:/ipfs/saver/gateway/https/ipfs.bluelightav.org\": {\n \"title\": \"$:/ipfs/saver/gateway/https/ipfs.bluelightav.org\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://ipfs.bluelightav.org\"\n },\n \"$:/ipfs/saver/gateway/https/ipfs.io\": {\n \"title\": \"$:/ipfs/saver/gateway/https/ipfs.io\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://ipfs.io\"\n },\n \"$:/ipfs/saver/gateway/https/ipfs.jes.xxx\": {\n \"title\": \"$:/ipfs/saver/gateway/https/ipfs.jes.xxx\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs $:/ipfs/saver/gateway\",\n \"text\": \"https://ipfs.jes.xxx\"\n },\n \"$:/ipfs/saver/gateway/https/ninetailed.ninja\": {\n \"title\": \"$:/ipfs/saver/gateway/https/ninetailed.ninja\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://ninetailed.ninja\"\n },\n \"$:/ipfs/saver/gateway/https/gateway.pinata.cloud\": {\n \"title\": \"$:/ipfs/saver/gateway/https/gateway.pinata.cloud\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://gateway.pinata.cloud\"\n },\n \"$:/ipfs/saver/gateway/https/siderus.io\": {\n \"title\": \"$:/ipfs/saver/gateway/https/siderus.io\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://siderus.io\"\n },\n \"$:/ipfs/saver/gateway/https/ipfs.sloppyta.co\": {\n \"title\": \"$:/ipfs/saver/gateway/https/ipfs.sloppyta.co\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://ipfs.sloppyta.co\"\n },\n \"$:/ipfs/saver/gateway/https/gateway.temporal.cloud\": {\n \"title\": \"$:/ipfs/saver/gateway/https/gateway.temporal.cloud\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://gateway.temporal.cloud\"\n },\n \"$:/ipfs/saver/gateway/https/ipfs.wa.hle.rs\": {\n \"title\": \"$:/ipfs/saver/gateway/https/ipfs.wa.hle.rs\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/ipfs/saver/gateway\",\n \"text\": \"https://ipfs.wa.hle.rs\"\n },\n \"$:/core/ui/Buttons/ipfs/console/mobile\": {\n \"title\": \"$:/core/ui/Buttons/ipfs/console/mobile\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/PageControls\",\n \"caption\": \"{{$:/core/images/preview-open}} {{$:/language/Buttons/Console/Mobile/Caption}}\",\n \"description\": \"{{$:/language/Buttons/Console/Mobile/Hint}}\",\n \"text\": \"\u003C$button message=\\\"tm-console-mobile\\\" tooltip={{$:/language/Buttons/Console/Mobile/Hint}} aria-label={{$:/language/Buttons/Console/Mobile/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/preview-open}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Console/Mobile/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"\n },\n \"$:/core/ui/Buttons/ipfs/pin\": {\n \"title\": \"$:/core/ui/Buttons/ipfs/pin\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/PageControls\",\n \"caption\": \"{{$:/core/images/chevron-up}} {{$:/language/Buttons/Ipfs/Pin/Caption}}\",\n \"description\": \"{{$:/language/Buttons/Ipfs/Pin/Hint}}\",\n \"text\": \"\u003C$button message=\\\"tm-ipfs-pin\\\" tooltip={{$:/language/Buttons/Ipfs/Pin/Hint}} aria-label={{$:/language/Buttons/Ipfs/Pin/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/chevron-up}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipfs/Pin/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"\n },\n \"$:/core/ui/Buttons/ens/publish\": {\n \"title\": \"$:/core/ui/Buttons/ens/publish\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/PageControls\",\n \"caption\": \"{{$:/core/images/ens}} {{$:/language/Buttons/Ens/Publish/Caption}}\",\n \"description\": \"{{$:/language/Buttons/Ens/Publish/Hint}}\",\n \"text\": \"\u003C$button message=\\\"tm-ens-publish\\\" tooltip={{$:/language/Buttons/Ens/Publish/Hint}} aria-label={{$:/language/Buttons/Ens/Publish/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/ens}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ens/Publish/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"\n },\n \"$:/core/ui/Buttons/ipns/publish\": {\n \"title\": \"$:/core/ui/Buttons/ipns/publish\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/PageControls\",\n \"caption\": \"{{$:/core/images/excise}} {{$:/language/Buttons/Ipns/Publish/Caption}}\",\n \"description\": \"{{$:/language/Buttons/Ipns/Publish/Hint}}\",\n \"text\": \"\u003C$button message=\\\"tm-ipns-publish\\\" tooltip={{$:/language/Buttons/Ipns/Publish/Hint}} aria-label={{$:/language/Buttons/Ipns/Publish/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/excise}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Publish/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"\n },\n \"$:/core/ui/Buttons/ipfs/unpin\": {\n \"title\": \"$:/core/ui/Buttons/ipfs/unpin\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/PageControls\",\n \"caption\": \"{{$:/core/images/chevron-down}} {{$:/language/Buttons/Ipfs/Unpin/Caption}}\",\n \"description\": \"{{$:/language/Buttons/Ipfs/Unpin/Hint}}\",\n \"text\": \"\u003C$button message=\\\"tm-ipfs-unpin\\\" tooltip={{$:/language/Buttons/Ipfs/Unpin/Hint}} aria-label={{$:/language/Buttons/Ipfs/Unpin/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/chevron-down}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipfs/Unpin/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"\n },\n \"$:/core/ui/ControlPanel/Saving/Ipfs\": {\n \"title\": \"$:/core/ui/ControlPanel/Saving/Ipfs\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/ControlPanel/Saving\",\n \"caption\": \"{{$:/language/ControlPanel/Saving/IpfsService/Caption}}\",\n \"text\": \"\\\\define lingo-base() $:/language/ControlPanel/Saving/IpfsService/\\n\\\\define service-name() Ipfs\\n\\n\u003C\u003Clingo Description>>\\n\\n''\u003C\u003Clingo Global>>''\\n\\n\u003Ctable>\\n\u003Ctbody>\\n\u003Ctr>\\n\u003Ctd width=\\\"90%\\\">''\u003C$link to=\\\"$:/ipfs/saver/verbose\\\">\u003C\u003Clingo Verbose/Description>>\u003C/$link>''\u003C/td>\\n\u003Ctd width=\\\"10%\\\">\u003C$checkbox tiddler=\\\"$:/ipfs/saver/verbose\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"yes\\\"/>\u003C/td>\\n\u003C/tr>\\n\u003Ctr>\\n\u003Ctd width=\\\"90%\\\">''\u003C$link to=\\\"$:/ipfs/saver/unpin\\\">\u003C\u003Clingo Unpin/Description>>\u003C/$link>''\u003C/td>\\n\u003Ctd width=\\\"10%\\\">\u003C$checkbox tiddler=\\\"$:/ipfs/saver/unpin\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"no\\\"/>\u003C/td>\\n\u003C/tr>\\n\u003C/tbody>\\n\u003C/table>\\n\\n''\u003C$link to=\\\"$:/ipfs/saver/provider\\\">\u003C\u003Clingo Provider>>\u003C/$link>''\\n\\n\u003C$radio tiddler=\\\"$:/ipfs/saver/provider\\\" value=\\\"default\\\">\u003C\u003Clingo Provider/Default/Description>>\u003C/$radio>\\n\u003C$radio tiddler=\\\"$:/ipfs/saver/provider\\\" value=\\\"window\\\">\u003C\u003Clingo Provider/Window/Description>>\u003C/$radio>\\n\u003C$radio tiddler=\\\"$:/ipfs/saver/provider\\\" value=\\\"http\\\">\u003C\u003Clingo Provider/HTTP/Description>>\u003C/$radio>\\n\\n''\u003C$link to=\\\"$:/ipfs/saver/export\\\">\u003C\u003Clingo Export>>\u003C/$link>''\\n\\n\u003C$radio tiddler=\\\"$:/ipfs/saver/export\\\" value=\\\"json\\\">\u003C\u003Clingo Export/Json/Description>>\u003C/$radio>\\n\u003C$radio tiddler=\\\"$:/ipfs/saver/export\\\" value=\\\"static\\\">\u003C\u003Clingo Export/Static/Description>>\u003C/$radio>\\n\u003C$radio tiddler=\\\"$:/ipfs/saver/export\\\" value=\\\"tid\\\">\u003C\u003Clingo Export/Tid/Description>>\u003C/$radio>\\n\\n''\u003C$link to=\\\"$:/ipfs/saver/protocol\\\">\u003C\u003Clingo Protocol>>\u003C/$link>''\\n\\n\u003C$radio tiddler=\\\"$:/ipfs/saver/protocol\\\" value=\\\"ens\\\">\u003C\u003Clingo Protocol/Ens/Description>>\u003C/$radio>\\n\u003C$radio tiddler=\\\"$:/ipfs/saver/protocol\\\" value=\\\"ipfs\\\">\u003C\u003Clingo Protocol/Ipfs/Description>>\u003C/$radio>\\n\u003C$radio tiddler=\\\"$:/ipfs/saver/protocol\\\" value=\\\"ipns\\\">\u003C\u003Clingo Protocol/Ipns/Description>>\u003C/$radio>\\n\\n''\u003C$link to=\\\"$:/ipfs/saver/policy\\\">\u003C\u003Clingo Policy>>\u003C/$link>''\\n\\n\u003C$radio tiddler=\\\"$:/ipfs/saver/policy\\\" value=\\\"origin\\\">\u003C\u003Clingo Policy/Origin/Description>>\u003C/$radio>\\n\u003C$radio tiddler=\\\"$:/ipfs/saver/policy\\\" value=\\\"gateway\\\">\u003C\u003Clingo Policy/Gateway/Description>>\u003C/$radio>\\n\\n''\u003C\u003Clingo Url>>''\\n\\n\u003Ctable>\\n\u003Ctbody>\\n\u003Ctr>\\n\u003Ctd width=\\\"20%\\\">''\u003C$link to=\\\"$:/ipfs/saver/api\\\">\u003C\u003Clingo ApiUrl>>\u003C/$link>''\u003C/td>\\n\u003Ctd width=\\\"80%\\\">\\n\u003C$select tiddler=\\\"$:/ipfs/saver/api\\\" default=\\\"$:/ipfs/saver/api/https/tube.copylaradio.com/5001\\\" class=\\\"tc-edit-texteditor\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/ipfs/saver/api]!has[draft.of]]\\\">\\n\u003Coption value=\u003C\u003CcurrentTiddler>>>\u003C$transclude field=\\\"text\\\">\u003C$text text=\u003C\u003CcurrentTiddler>>/>\u003C/$transclude>\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\\n\u003C/td>\\n\u003C/tr>\\n\u003Ctr>\\n\u003Ctd width=\\\"20%\\\">''\u003C$link to=\\\"$:/ipfs/saver/gateway\\\">\u003C\u003Clingo GatewayUrl>>\u003C/$link>''\u003C/td>\\n\u003Ctd width=\\\"80%\\\">\\n\u003C$select tiddler=\\\"$:/ipfs/saver/gateway\\\" default=\\\"$:/ipfs/saver/gateway/https/tube.copylaradio.com\\\" class=\\\"tc-edit-texteditor\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/ipfs/saver/gateway]!has[draft.of]]\\\">\\n\u003Coption value=\u003C\u003CcurrentTiddler>>>\u003C$transclude field=\\\"text\\\">\u003C$text text=\u003C\u003CcurrentTiddler>>/>\u003C/$transclude>\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\\n\u003C/td>\\n\u003C/tr>\\n\u003C/tbody>\\n\u003C/table>\\n\\n''\u003C\u003Clingo Ens>>''\\n\\n\u003Ctable>\\n\u003Ctbody>\\n\u003Ctr>\\n\u003Ctd width=\\\"20%\\\">''\u003C$link to=\\\"$:/ipfs/saver/ens/domain\\\">\u003C\u003Clingo EnsDomain>>\u003C/$link>''\u003C/td>\\n\u003Ctd width=\\\"80%\\\">\u003C$edit-text tiddler=\\\"$:/ipfs/saver/ens/domain\\\" class=\\\"tc-edit-texteditor\\\" default=\\\"\\\" tag=\\\"input\\\"/>\u003C/td>\\n\u003C/tr>\\n\u003C/tbody>\\n\u003C/table>\\n\\n\u003Ctable style=\\\"width:20%;margin-left:40%;margin-right:40%;text-align:center;\\\">\\n\u003Ctbody>\\n\u003Ctr>\\n\u003Ctd style=\\\"width:10%\\\">\\n\u003C$button message=\\\"tm-ens-manager-open\\\" tooltip={{$:/language/Buttons/Ens/Manager/Open/Hint}} aria-label={{$:/language/Buttons/Ens/Manager/Open/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/ens}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ens/Manager/Open/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/td>\\n\u003Ctd style=\\\"width:10%\\\">\\n\u003C$button message=\\\"tm-ens-resolve-and-open\\\" tooltip={{$:/language/Buttons/Ens/Resolve/And/Open/Hint}} aria-label={{$:/language/Buttons/Ens/Resolve/And/Open/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/globe}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ens/Resolve/And/Open/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/td>\\n\u003C/tr>\\n\u003C/tbody>\\n\u003C/table>\\n\\n''\u003C\u003Clingo Ipns>>''\\n\\n\u003Ctable>\\n\u003Ctbody>\\n\u003Ctr>\\n\u003Ctd width=\\\"20%\\\">''\u003C$link to=\\\"$:/ipfs/saver/ipns/name\\\">\u003C\u003Clingo IpnsName>>\u003C/$link>''\u003C/td>\\n\u003Ctd width=\\\"80%\\\">\u003C$edit-text tiddler=\\\"$:/ipfs/saver/ipns/name\\\" class=\\\"tc-edit-texteditor\\\" default=\\\"\\\" tag=\\\"input\\\"/>\u003C/td>\\n\u003C/tr>\\n\u003Ctr>\\n\u003Ctd width=\\\"20%\\\">''\u003C$link to=\\\"$:/ipfs/saver/ipns/key\\\">\u003C\u003Clingo IpnsKey>>\u003C/$link>''\u003C/td>\\n\u003Ctd width=\\\"80%\\\">\u003C$text text={{$:/ipfs/saver/ipns/key}} class=\\\"tc-edit-texteditor\\\"/>\u003C/td>\\n\u003C/tr>\\n\u003C/tbody>\\n\u003C/table>\\n\\n\u003Ctable style=\\\"width:50%;margin-left:25%;margin-right:25%;text-align:center;\\\">\\n\u003Ctbody>\\n\u003Ctr>\\n\u003Ctd style=\\\"width:10%\\\">\\n\u003C$button message=\\\"tm-ipns-rename\\\" tooltip={{$:/language/Buttons/Ipns/Rename/Hint}} aria-label={{$:/language/Buttons/Ipns/Rename/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/mono-line}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Rename/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/td>\\n\u003Ctd style=\\\"width:10%\\\">\\n\u003C$button message=\\\"tm-ipns-generate\\\" tooltip={{$:/language/Buttons/Ipns/Generate/Hint}} aria-label={{$:/language/Buttons/Ipns/Generate/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/new-here-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Generate/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/td>\\n\u003Ctd style=\\\"width:10%\\\">\\n\u003C$button message=\\\"tm-ipns-remove\\\" tooltip={{$:/language/Buttons/Ipns/Remove/Hint}} aria-label={{$:/language/Buttons/Ipns/Remove/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/delete-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Remove/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/td>\\n\u003Ctd style=\\\"width:10%\\\">\\n\u003C$button message=\\\"tm-ipns-fetch\\\" tooltip={{$:/language/Buttons/Ipns/Fetch/Hint}} aria-label={{$:/language/Buttons/Ipns/Fetch/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/refresh-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Fetch/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/td>\\n\u003Ctd style=\\\"width:10%\\\">\\n\u003C$button message=\\\"tm-ipns-resolve-and-open\\\" tooltip={{$:/language/Buttons/Ipns/Resolve/And/Open/Hint}} aria-label={{$:/language/Buttons/Ipns/Resolve/And/Open/Caption}} class=\\\"tc-btn-invisible tc-ipfs-action\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/globe}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipns/Resolve/And/Open/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/td>\\n\u003C/tr>\\n\u003C/tbody>\\n\u003C/table>\"\n },\n \"$:/core/ui/Buttons/ipfs/export/attachment\": {\n \"title\": \"$:/core/ui/Buttons/ipfs/export/attachment\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/ViewToolbar\",\n \"caption\": \"{{$:/core/images/ipfs}} {{$:/language/Buttons/Ipfs/Export/Attachment/Caption}}\",\n \"description\": \"{{$:/language/Buttons/Ipfs/Export/Attachment/Hint}}\",\n \"text\": \"\\\\whitespace trim\\n\u003C$button message=\\\"tm-ipfs-export-attachment\\\" param=\u003C\u003CcurrentTiddler>> tooltip={{$:/language/Buttons/Ipfs/Export/Attachment/Hint}} aria-label={{$:/language/Buttons/Ipfs/Export/Attachment/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/ipfs}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text=\\\" \\\"/>\\n\u003C$text text={{$:/language/Buttons/Ipfs/Export/Attachment/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"\n },\n \"$:/core/ui/Buttons/ipfs/export/content\": {\n \"title\": \"$:/core/ui/Buttons/ipfs/export/content\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/ViewToolbar\",\n \"caption\": \"{{$:/core/images/excise}} {{$:/language/Buttons/Ipfs/Export/Content/Caption}}\",\n \"description\": \"{{$:/language/Buttons/Ipfs/Export/Content/Hint}}\",\n \"text\": \"\\\\whitespace trim\\n\u003C$button message=\\\"tm-ipfs-export-content\\\" param=\u003C\u003CcurrentTiddler>> tooltip={{$:/language/Buttons/Ipfs/Export/Content/Hint}} aria-label={{$:/language/Buttons/Ipfs/Export/Content/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/excise}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text=\\\" \\\"/>\\n\u003C$text text={{$:/language/Buttons/Ipfs/Export/Content/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"\n },\n \"$:/core/ui/Buttons/ipfs/export\": {\n \"title\": \"$:/core/ui/Buttons/ipfs/export\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/ViewToolbar\",\n \"caption\": \"{{$:/core/images/excise}} {{$:/language/Buttons/Ipfs/Export/Caption}}\",\n \"description\": \"{{$:/language/Buttons/Ipfs/Export/Hint}}\",\n \"text\": \"\\\\whitespace trim\\n\u003C$button message=\\\"tm-ipfs-export\\\" param=\u003C\u003CcurrentTiddler>> tooltip={{$:/language/Buttons/Ipfs/Export/Hint}} aria-label={{$:/language/Buttons/Ipfs/Export/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/excise}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text=\\\" \\\"/>\\n\u003C$text text={{$:/language/Buttons/Ipfs/Export/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"\n },\n \"$:/core/ui/Buttons/ipfs/refresh\": {\n \"title\": \"$:/core/ui/Buttons/ipfs/refresh\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/ViewToolbar\",\n \"caption\": \"{{$:/core/images/refresh-button}} {{$:/language/Buttons/Ipfs/Refresh/Caption}}\",\n \"description\": \"{{$:/language/Buttons/Ipfs/Refresh/Hint}}\",\n \"text\": \"\u003C$button message=\\\"tm-refresh-tiddler\\\" param=\u003C\u003CcurrentTiddler>> tooltip={{$:/language/Buttons/Ipfs/Refresh/Hint}} aria-label={{$:/language/Buttons/Ipfs/Refresh/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/refresh-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Ipfs/Refresh/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"\n },\n \"$:/core/ui/Buttons/ipfs/tiddler/pin\": {\n \"title\": \"$:/core/ui/Buttons/ipfs/tiddler/pin\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/ViewToolbar\",\n \"caption\": \"{{$:/core/images/chevron-up}} {{$:/language/Buttons/Ipfs/Tiddler/Pin/Caption}}\",\n \"description\": \"{{$:/language/Buttons/Ipfs/Tiddler/Pin/Hint}}\",\n \"text\": \"\\\\whitespace trim\\n\u003C$button message=\\\"tm-ipfs-pin\\\" param=\u003C\u003CcurrentTiddler>> tooltip={{$:/language/Buttons/Ipfs/Tiddler/Pin/Hint}} aria-label={{$:/language/Buttons/Ipfs/Tiddler/Pin/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/chevron-up}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text=\\\" \\\"/>\\n\u003C$text text={{$:/language/Buttons/Ipfs/Tiddler/Pin/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"\n },\n \"$:/core/ui/Buttons/ipfs/tiddler/unpin\": {\n \"title\": \"$:/core/ui/Buttons/ipfs/tiddler/unpin\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/ViewToolbar\",\n \"caption\": \"{{$:/core/images/chevron-down}} {{$:/language/Buttons/Ipfs/Tiddler/Unpin/Caption}}\",\n \"description\": \"{{$:/language/Buttons/Ipfs/Tiddler/Unpin/Hint}}\",\n \"text\": \"\\\\whitespace trim\\n\u003C$button message=\\\"tm-ipfs-unpin\\\" param=\u003C\u003CcurrentTiddler>> tooltip={{$:/language/Buttons/Ipfs/Tiddler/Unpin/Hint}} aria-label={{$:/language/Buttons/Ipfs/Tiddler/Unpin/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/chevron-down}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text=\\\" \\\"/>\\n\u003C$text text={{$:/language/Buttons/Ipfs/Tiddler/Unpin/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"\n },\n \"$:/plugins/ipfs/styles\": {\n \"title\": \"$:/plugins/ipfs/styles\",\n \"modified\": \"20200528094915385\",\n \"tags\": \"$:/ipfs/core $:/tags/Stylesheet\",\n \"type\": \"text/css\",\n \"text\": \".tc-ipfs-action {\\n display: block;\\n margin: auto;\\n width: 18px;\\n height: 18px;\\n}\\n\\n.tc-icon-ipfs-wrapper {\\n display: inline-block;\\n width: 1em;\\n height: 1em;\\n}\\n\\na.tc-ipfs-link-external {\\n\\ttext-decoration: underline;\\n\\tcolor: \u003C\u003Ccolour external-link-foreground>>;\\n\\tbackground-color: \u003C\u003Ccolour external-link-background>>;\\n}\\n\\na.tc-ipfs-link-external:visited {\\n\\tcolor: \u003C\u003Ccolour external-link-foreground-visited>>;\\n\\tbackground-color: \u003C\u003Ccolour external-link-background-visited>>;\\n}\\n\\na.tc-ipfs-link-external:hover {\\n\\tcolor: \u003C\u003Ccolour external-link-foreground-hover>>;\\n\\tbackground-color: \u003C\u003Ccolour external-link-background-hover>>;\\n cursor: pointer;\\n}\"\n }\n }\n}","author":"Xavier Maysonnave","core-version":">=5.1.2","dependents":"","description":"IPFS with TiddlyWiki","license":"GPL-3.0-or-later","list":"readme changelog","plugin-type":"plugin","source":"https://github.com/xmaysonnave/tiddlywiki-ipfs","version":"v0.3.0-200603399"}, {"text":"{\n \"tiddlers\": {\n \"GeoTiddler\": {\n \"title\": \"GeoTiddler\",\n \"created\": \"20151130173416239\",\n \"modified\": \"20170115153450584\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"[[GeoTiddler]]s are tiddlers containing geographical data. [[geoSyntax|$:/plugins/sycom/leaflet/geoSyntax]] lists the available objects. [[geoJson|https://en.wikipedia.org/wiki/GeoJSON]] data are also accepted. You may specify a color for all objects displayed through `color` field.\\n\\n!! tiddler with geo TiddlerFields\\nYou can upgrade your tiddler by putting some geo metadata ([[wgs 84 coordinates|https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84]]) in it's TiddlerFields. See [[geoSyntax|$:/plugins/sycom/leaflet/geoSyntax]] for the list of object types you can draw. Popup will show the first part of the tiddler. If the tiddler contains a leafmap widget, it will be rendered as `text/plain` in order to avoid crash...\\n\\n!! geoJSON tiddler\\nYou can define a geoJson tiddler like [[tiddlyWikiFrCommunity|$:/plugins/sycom/leaflet/example/tiddlyWikiFrCommunity]] and then display the data by calling it. Just put your geoJson data in the body and declare the tiddler as application/json. Any `application/json` tiddler called will be considered as geoJson. The popups will show\\n\\n* a title\\n** the `name` or the `title` attribute in properties if exists,\\n** if not, the firsts attributes of properties until they are 8 characters long\\n* a description\\n** the `description` attribute in properties if exists,\\n** if not, the data stored in each feature as a bulleted list.\\n\\n!! tiddler grouping [[GeoTiddler]]s\\nYou can use `tiddlers` or `filter` as TiddlerFields to make a group of tiddlers. You can apply some styling options to all the group using `style`, `color` or `marker` TiddlerFields and then call the tiddler in your map to render all those tiddler at the same time. This will be a good way to make thematic maps indeed...\\n\"\n },\n \"$:/plugins/sycom/leaflet/devDiary\": {\n \"title\": \"$:/plugins/sycom/leaflet/devDiary\",\n \"created\": \"20151110173416000\",\n \"modified\": \"20180531171500000\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"Some notes about coding this plugin. Might be useful to others...\\n\\n* 20180602\\n** added a template that will display a map of embeded object for tiddlers containing one of the geoTiddlers fiels.\\n** updtated leaflet and marker-cluster to 1.3.1 - the easy way. Just replaced with new version and no deprecation at all \\\\o/ !\\n* 20180531\\n** converting all `.svg.tid` files to `.svg` + `.svg.meta` pairs. Will allow git client to make svg viewable in web interface. Also compressed SVG as much as possible with great https://jakearchibald.github.io/svgomg/ tool.\\n** tweak : for svg embedding local TiddlyWiki colors (eg `$primary$`), forced type to `text/vnd.tiddlywiki` to preserve them.\\n* 20170317\\n** lot of work around cluster size, cluster color when using filter. Cluster size depends on point % for the cluster, clusterRadius and zoom.\\n* 20170311\\n** added styling options and also the grouping tiddler capabilities. Discovered that direct styling in SVG ''does not always'' [[overwrite css styling|http://stackoverflow.com/questions/24293880/svg-why-does-external-css-override-inline-style-for-text]].\\n* 20170129\\n** adding some markers. And it's possible to create yours.\\n* 20170115\\n** darling birthday edit. Clustering by tiddler is on track. Will have to look for clustering direct passing object through widget.\\n* 20161111\\n** armistice edit! can now disable clustering or set clustering distance. Bug #9 fixed. may be cluster size will be too big for big databases\\n* 20161106\\n** color parameter is partially implemented. Note that direct styling like `fill` in svg element wont take on class styling through css...\\n* 20161104\\n** after many attemps, managed to include tiddler excerpt in popups for mapping geoTiddler. Had to include an escape rule for tiddler containing a leafmap widget. No larsen, but a big bug (map number probably).\\n** also managed to give the marker the color of the primary color. Note for later there is probably a bug if primary color is defined with `\u003C\u003Ccolour>>` macro.\\n* 20161102\\n** ok, when importing some library, don't forget to use `require()` in order to conclude. Silly guy. Still some polishing needed, but clustering know works...\\n* 20161101\\n** fighting with markercluster capabilities. At this point seems I can add the script but the MarkerClusterGroup class is not recognized when called...\\n* 20161031\\n** gave up inserting external layers.svg in stylesheet. Issues with `\u003C$text />` and `{{ }}`... Created svg in a separate tiddler for the record but inserting directly an \\\"escaped\\\" version in [[mapCss.css|$:/plugins/sycom/leaflet/mapCssTweaks.css.tid]]\\n* 20161030\\n** working on different markers. Not so good at designing them though ;-) Putted default leaflet svg marker. Using Inkscape to edit svg easily and SVGO extension in atom to compress them. First attempt to put layers icon as svg. Issues...\\n* 20161029\\n** trying to put svg marker instead of png ones. Will be better for changing colors, content... using data:image/svg+xml. Svg has to bring xmlns ~~and xmlns:xlink~~ with it in order to work...\\n* 20161025\\n** after big fight, managed to call images as embeded through css without writing full base64 code. Had to add `html` to the \\\"rules only\\\" list at the beginning of the css code\\n* 20161024\\n** geojson implemented. Will need to add cluster soon. Some question about geojson attributes to create the popup...\\n* 20161021\\n** updated leaflet.js to 1.0.1 moved base64 image to mapCss.css in order to avoid problems when updating leaflet.\\n** Updated tileLayer list. min/max checked for this time. Detect if tile id is wrong to alert user and display osm instead.\\n* 20160314\\n** corrected caption errors for example and roadmap. Have to write an install process in demo site (gh-page) since writing this in plugin is nonsense.\\n* 20151124\\n** wondering the best way to release plugin code in gitlab (or github). Can't be a fork of TiddlyWiki. Don't want to lose .git history.\\n** ok I'm dumb. All is written in the dev TiddlyWiki : http://tiddlywiki.com/dev/#Developing%20p lugins%20using%20Node.js%20and%20GitHub . Lost .git history since cuting tree is bad. But history was still short...\\n* 20151123\\n** not able to use directly tiddler stored images as css background.\\n** decided to use base64 form in css. Not so elegant as I wished, but works.\\n* 20151121\\n** fighting with parameters : not imported from widget with `this.getAttribute()`\\n** solved by adding the parameter computation before : `this.computeAttributes();`\\n* 20151115\\n** some problems to declare leaflet.js library : fail during build since there is no window, no document.\\n** solved by creating the tiddlywiki.files importer.\\n* 20151110\\n** starting some tests. Inspiration from d3plugin (also creating widget and importing library)\\n\"\n },\n \"$:/plugins/sycom/leaflet/geoSyntax\": {\n \"title\": \"$:/plugins/sycom/leaflet/geoSyntax\",\n \"created\": \"20151119173416239\",\n \"modified\": \"20151211173250584\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"caption\": \"geoSyntax\",\n \"text\": \"Geographical objects can be stored\\n\\n* in a GeoTiddler by creating a ''//type// : // pattern//'' metadata field pair in any tiddler or by storing geoJson data in it and setting your tiddler to `application/JSON` type. Call it in the widget with ''places'' attribute : `places='{\\\"tiddler\\\":\\\"title of your tiddler\\\"}'`\\n* in several [[GeoTiddlers|GeoTiddler]]. Call them in the widget with ''places'' attribute\\n** via a space separated list of [[GeoTiddlers|GeoTiddler]] : `places='{\\\"tiddlers\\\":\\\"tiddler1 tiddler2 tiddler3\\\"}'`\\n** via a [[filter|http://tiddlywiki.com/#Filters]] selection of [[GeoTiddlers|GeoTiddler]] : `places='{\\\"filter\\\":\\\"[[your filter]]\\\"}'`\\n* straight in the widget with ''places'' attribute : `places='{\\\"object type\\\":\\\"coordinates pattern\\\"}'`\\n\\n!! Everything might be a GeoTiddler\\n\\nIn a very much tiddlywiki way, a tiddler may also refer to a list or a selection of tiddlers using `tiddlers` or `filter` metadata fields. You may add styling informations to all refered tiddler with `style`, `color` or `marker` metadata fields. Calling this tiddler with `\u003C$leafmap />` will render all refered tiddlers.\\n\\n!! Tool for creating shapes\\nAs not everyone has a GIS in his head, And the plugin does not implement yet any tool for creating geo shapes, there is (very basic) tool for that : [ext[Draw for TiddlyWiki leaflet plugin|http://sycom.github.io/TiddlyWiki-Plugins/leafletDraw.html]]\\n\\n!! Geographical objects you can display on your map\\n\\n| !type | !description | !pattern |\\n|''point'' |a unique point defined by a comma separated latitude,longitude pair |`y,x` |\\n|''points''|a points collection defined by a space separated ''point'' definition list |`y1,x1 y2,x2 y3,x3 ...` |\\n|''polygon''|a closed surfacic place defined like an //ordered// ''points'' collection just above |`y1,x1 y2,x2 y3,x3 ...` |\\n|''polygons''|a polygons collection defined by a pipe (`|`) separated list of ''polygon'' definitions |`y1,x1 y2,x2 y3,x3|y4,x4 y5...` |\\n|''polyline''|an open path place defined like the ''polygon'' just above |`y1,x1 y2,x2 y3,x3 ...` |\\n|''polylines''|a polylines collection defined by a pipe (`|`) separated list of ''polyline'' definitions |`y1,x1 y2,x2 y3,x3|y4,x4 y5...` |\\n|''geojson''|a [[geojson|http://geojson.org/]] object. If set through a tiddler field, please crunch it to one single line|see [[rfc7946|https://tools.ietf.org/html/rfc7946]]|\\n\"\n },\n \"$:/plugins/sycom/leaflet/markers\": {\n \"title\": \"$:/plugins/sycom/leaflet/markers\",\n \"created\": \"20170129172401910\",\n \"modified\": \"20170129172401910\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"caption\": \"Markers\",\n \"text\": \"markers are used to display point(s) related informations. Default marker is [[marker|$:/plugins/sycom/leaflet/images/marker.svg]].\\n\\n!! Available markers\\n\\nfor now, available markers are those\\n\\n\u003C$list filter='[all[shadows]has[marker_dim]has[caption]]'>\u003Cspan style=\\\"display:inline-block;text-align:center;margin:0 .5em;padding:.5em;border:.5px dotted\\\">\u003C$tiddler tiddler={{!!title}}>\u003C$transclude/>\u003C/$tiddler>\u003Cbr/>\u003C$link to={{!!title}}>{{!!caption}}\u003C/$link>\u003C/span>\u003C/$list>\\n\\n!! Create your own markers\\n\\nHave a look at existing ones above for inspiration and hack. Markers are svg pieces with some mandatory tweaks :\\n\\n* a marker is based upon ''two'' tiddlers, one for the marker and one for the shadow\\n* add a `caption` field to the marker tiddler (not for the shadow svg).\\n* the `title` of your marker tiddler will be `$:/plugins/sycom/leaflet/images/`''caption''`.svg`\\n* and the `title` of the marker shadow tiddler will be `$:/plugins/sycom/leaflet/images/`''caption''`shadow.svg`\\n* a `marker_dim` field wich defines //width// //height// //x-anchor// //y-anchors//. Please check that your //width// and //height// value are the same as in `\u003Csvg (...) width=\\\"15\\\" height=\\\"15\\\">`\\n* don't forget to add `xmlns` attribute : `\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" (...)`\\n* if you want your marker to change color upon tiddlywiki or widget parameters, use `$primary$` for the color attribute of your svg\\n\"\n },\n \"$:/plugins/sycom/leaflet/roadmap\": {\n \"title\": \"$:/plugins/sycom/leaflet/roadmap\",\n \"created\": \"20151209173416000\",\n \"modified\": \"20180531171500000\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"caption\": \"Roadmap\",\n \"text\": \"Not really a roadmap just a list for future development ideas. You'd better take a look at [[issues|https://framagit.org/sycom/TiddlyWiki-Plugins/boards]] on the repo. And add yours if you dare ;-)\\n\\n* add a tool to draw shapes, lines and collect coordinates. Until this, You may use [[Draw for TiddlyWiki leaflet plugin|http://sycom.github.io/TiddlyWiki-Plugins/leafletDraw.html]]\\n* add categories options\\n* add text, title capabilities\\n* try a tiddler template based upon field presence to render data for all geoTiddler\\n* ...\\n\\n* ~~try to put other types of pins (svg? icons?)~~ ''0.8.0'' : you may change markers via the //marker// option and design your own markers\\n* ~~add color(s) options~~ ''0.7.2'' : color can be set via //color// tiddler field or forced through //color// option\\n* ~~add a clustering functionality (at least for points)~~ ''0.7.0'' : each data group is know clustering points\\n* ~~add geoJSON tiddlers~~ ''0.6.0'' : added geojsontiddler rendering\\n* ~~map tiddlers with the same tag(s)~~ ''0.5.0'' : added filter places request\\n\"\n },\n \"$:/plugins/sycom/leaflet/tileLayers\": {\n \"title\": \"$:/plugins/sycom/leaflet/tileLayers\",\n \"created\": \"20151119173416239\",\n \"modified\": \"20161020222250584\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"caption\": \"tileLayers\",\n \"text\": \"tileLayers are the //background// of the leaflet map. They will not be available offline and will not display at every zoom level.\\n\\n!! Available tile layers\\n\\nedit [[tileLayers.json|$:/plugins/sycom/leaflet/lib/tileLayers.json]] if you want to add / remove tile layers.\\n\\n| !id | !description | !zoom min/max |\\n|''osm'' |[[OpenStreetMap|http://openstreetmap.org]] classic tile layer | 1/20 |\\n|''osmfr'' |[[OpenStreetMap|http://openstreetmap.org]] with //baguette// smell | 1/20 |\\n|''osmbw'' |Black and White version of [[OpenStreetMap|http://openstreetmap.org]] tiles by Wikimedia labs | 1/20 |\\n|''sat'' |Satellite photographic layer provided by Esri | 1/18 |\\n|''natgeo'' |National Geographic style layer provided by Esri| 1/12 |\\n|''toner'' |Black and white styled OpenStreetMap data provided by [[Stamen|http://stamen.com]] | 1/20 |\\n|''water'' |Watercolor styled OpenStreetMap data provided by [[Stamen|http://stamen.com]] | 1/20 |\\n|''thunder'' |Pale styled OpenStreetMap data provided by [[Thunderforest|http://thunderforest.com]] | 1/20 |\\n|''dark'' |\\\"Dark Matter\\\" styled OpenStreetMap data provided by [[CartoDB|https://cartodb.com/basemaps]] | 1/20 |\\n|''positron'' |\\\"Positron\\\" styled OpenStreetMap data provided by [[CartoDB|https://cartodb.com/basemaps]] | 1/20 |\\n\"\n },\n \"$:/plugins/sycom/leaflet/usage\": {\n \"title\": \"$:/plugins/sycom/leaflet/usage\",\n \"created\": \"20151119173416239\",\n \"modified\": \"20170129153650584\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"caption\": \"Usage\",\n \"text\": \"The widget is called by using `\u003C$leafmap />`. You may specify some options :\\n\\n!!! widget attributes\\n|!Attribute |!Description |!Default |\\n|''width'' |the width of the map (px or tiddler %)| `100%`|\\n|''height''|the height of the map (px only)| `420px`|\\n\\n!!! leaflet map attributes\\n|!Attribute |!Description |!Default |\\n|''places'' |a json object with the geographical data you want to display. Can be stored in tiddlers as metadata fields. See [[geoSyntax|$:/plugins/sycom/leaflet/geoSyntax]] for more informations ||\\n|''style'' |a json object containing styling information for your polygons and polylines objects in the map. Will overwrite GeoTiddler style if exists. Refer to [[leaflet documentation|http://leafletjs.com/reference-1.0.3.html#path]] for all options| `{ }`|\\n|''color'' |a color for drawing that will apply to all objects in the map. Will also overwrite GeoTiddler color attributes and //style// (if defined) colors| `\u003C\u003Ccolour primary>>`|\\n|''marker''|the name of the marker you want for points. See [[markers|$:/plugins/sycom/leaflet/markers]] for more informations| `marker`|\\n|''tile'' |the //id// or the //number// of the tile layer you want to use. See [[tileLayers|$:/plugins/sycom/leaflet/tileLayers]] for more informations | `osm`|\\n|''cluster''|set the clustering distance between points. also can disable clustering with no value or `0` or `\\\"\\\"`| `80`|\\n|''clusterType''|set if points are clustered for whole map (`map`) or for each tiddler (`tiddler`) displayed.| `map`|\\n|''tileControl'' |''if present'' add a control to select the tile layer you want ||\\n|''lat'' |map center latitude. Will overwrite places auto-centering | `52.8`|\\n|''long'' |map center longitude. Will overwrite places auto-centering | `-2.6`|\\n|''zoom'' |zoom level as defined by leaflet : int value between `0` (world map) and `20` (ant view) | |\\n\"\n },\n \"$:/plugins/sycom/leaflet/example\": {\n \"title\": \"$:/plugins/sycom/leaflet/example\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"caption\": \"Example\",\n \"text\": \"Different ways to use the [[leaflet plugin|$:/plugins/sycom/leaflet]]\\n\\n{{$:/plugins/sycom/leaflet/example/leaflet_with_geotiddler}}\\n\\n{{$:/plugins/sycom/leaflet/example/leaflet_with_geojsontiddler}}\\n\\n{{$:/plugins/sycom/leaflet/example/leaflet_with_non-tiddler_geo_data}}\\n\\n{{$:/plugins/sycom/leaflet/example/leaflet_with_filter}}\\n\"\n },\n \"$:/plugins/sycom/leaflet/example/leaflet_with_filter\": {\n \"title\": \"$:/plugins/sycom/leaflet/example/leaflet_with_filter\",\n \"created\": \"20151211173500000\",\n \"modified\": \"20170317163500000\",\n \"text\": \"!! a map of a filter\\nthis one displays all tiddlers tagged with \u003C\u003Ctag example>> (there's a //all shadow// tweak, since they are shadowed). There is also one cluster per tiddler. Some colors are set from within each tiddler with `color` field.\\n\\n```\\n\u003C$leafmap tile='toner'\\n\\tplaces='{\\\"filter\\\":\\\"[all[shadows]tag[example]]\\\"}' clusterType='tiddler'/>\\n```\\n\u003C$leafmap tile='toner'\\n\\tplaces='{\\\"filter\\\":\\\"[all[shadows]tag[example]]\\\"}' clusterType='tiddler'/>\\n\"\n },\n \"$:/plugins/sycom/leaflet/example/leaflet_with_geojsontiddler\": {\n \"title\": \"$:/plugins/sycom/leaflet/example/leaflet_with_geojsontiddler\",\n \"created\": \"20161025150936935\",\n \"modified\": \"20170318235936935\",\n \"tags\": \"example leaflet\",\n \"text\": \"!! a map of a geoJson tiddler\\nThis one displays [[tiddlyWikiFrCommunity|$:/plugins/sycom/leaflet/example/tiddlyWikiFrCommunity]] (that has a color field set to red), which is an almost direct geojson data extraction from the umap [[Utilisateurs du forum TiddlyWiki FR|https://umap.openstreetmap.fr/fr/map/tiddlywikifr_65983#6/46.995/2.549]]. `color` is set to orange, `marker` to pin. Cluster distance is default (80) on the first, set to 30 on the second.\\n\\n```\\n\u003C$leafmap tileControl\\n places='{\\\"tiddler\\\":\\\"$:/plugins/sycom/leaflet/example/tiddlyWikiFrCommunity\\\"}'\\n style='{\\\"color\\\":\\\"orange\\\"}'\\n marker='pin'/>\\n\u003C$leafmap tileControl cluster=\\\"30\\\"\\n places='{\\\"tiddler\\\":\\\"$:/plugins/sycom/leaflet/example/tiddlyWikiFrCommunity\\\"}'\\n marker='pin'/>\\n```\\n\u003C$leafmap tileControl\\n places='{\\\"tiddler\\\":\\\"$:/plugins/sycom/leaflet/example/tiddlyWikiFrCommunity\\\"}'\\n style='{\\\"color\\\":\\\"orange\\\"}'\\n marker='pin'/>\\n\u003C$leafmap tileControl cluster=\\\"30\\\"\\n places='{\\\"tiddler\\\":\\\"$:/plugins/sycom/leaflet/example/tiddlyWikiFrCommunity\\\"}'\\n marker='pin'/>\\n\"\n },\n \"$:/plugins/sycom/leaflet/example/leaflet_with_geotiddler\": {\n \"title\": \"$:/plugins/sycom/leaflet/example/leaflet_with_geotiddler\",\n \"created\": \"20151207090936935\",\n \"modified\": \"20161025222038568\",\n \"tags\": \"example leaflet\",\n \"text\": \"!! a map of a GeoTiddler\\nthis one displays the tiddler [[placeTiddler|$:/plugins/sycom/leaflet/example/placeTiddler]]. Note the tileControl attribute that enables map background selection. As the tiddler has its `color` field set to pink, objects are rendered pink. The cat is know a panther ;-). The tiddler also have a `style` field to define dash and thickness of the stroke...\\n\\n```\\n\u003C$leafmap\\n tileControl\\n places='{\\\"tiddler\\\":\\\"$:/plugins/sycom/leaflet/example/placeTiddler\\\"}'/>\\n```\\n\u003C$leafmap\\n tileControl\\n places='{\\\"tiddler\\\":\\\"$:/plugins/sycom/leaflet/example/placeTiddler\\\"}'/>\\n\"\n },\n \"$:/plugins/sycom/leaflet/example/leaflet_with_non-tiddler_geo_data\": {\n \"title\": \"$:/plugins/sycom/leaflet/example/leaflet_with_non-tiddler_geo_data\",\n \"point\": \"6.5,19.72\",\n \"created\": \"20151207090936935\",\n \"modified\": \"20151211172038568\",\n \"tags\": \"example leaflet\",\n \"text\": \"!! a map with data on the go\\nvery useful for fast mapping. All objects that might be embedded in GeoTiddler can be used here. Let's display a map with satellite imagery and\\n\\n* a ''point'' at `6.5,19.72`\\n* a ''polyline'' at `6.4,19.7 6.6,19.74`\\n\\nnote this tiddler is also a geoTiddler with one point at `6.5,19.72`\\n\\n```\\n\u003C$leafmap tile='sat'\\n\\tplaces='{\\\"point\\\":\\\"6.5,19.72\\\",\\\"polyline\\\":\\\"6.4,19.7 6.6,19.74\\\"}'/>\\n```\\n\\n\u003C$leafmap tile='sat'\\n\\tplaces='{\\\"point\\\":\\\"6.5,19.72\\\",\\\"polyline\\\":\\\"6.4,19.7 6.6,19.74\\\"}'/>\\n\"\n },\n \"$:/plugins/sycom/leaflet/example/placeTiddler\": {\n \"title\": \"$:/plugins/sycom/leaflet/example/placeTiddler\",\n \"points\": \"52.799933,-2.589812 52.799959,-2.590939\",\n \"polygon\": \"52.800608,-2.591668 52.800225,-2.591829 52.799849,-2.591937 52.799603,-2.591990 52.799427,-2.591990 52.799187,-2.591894 52.798863,-2.591550 52.798727,-2.591357 52.798662,-2.591121 52.798636,-2.590853 52.798655,-2.590542 52.798668,-2.590467 52.798701,-2.590359 52.798649,-2.590113 52.798623,-2.589920 52.798610,-2.589716 52.798636,-2.589437 52.798694,-2.589136 52.798850,-2.588975 52.799051,-2.588793 52.799311,-2.588707 52.799525,-2.588707 52.799726,-2.588772 52.800018,-2.588857 52.800290,-2.588911 52.800511,-2.589040 52.800731,-2.589126 52.800816,-2.589211 52.800413,-2.589812 52.800446,-2.590166 52.800452,-2.590520 52.800433,-2.590810 52.800426,-2.591068 52.800751,-2.591550 52.800621,-2.591679\",\n \"polylines\": \"52.799382,-2.590059 52.799641,-2.588321|52.799330,-2.590048 52.799447,-2.588342|52.799265,-2.590059 52.799181,-2.588342|52.799486,-2.590724 52.799706,-2.592301|52.799414,-2.590767 52.799525,-2.592366|52.799356,-2.590714 52.799278,-2.592355\",\n \"created\": \"20151119173416000\",\n \"modified\": \"20151211173153114\",\n \"color\": \"#ff80c0\",\n \"style\": \"{\\\"dashArray\\\":\\\"6, 10\\\",\\\"weight\\\":\\\"8\\\"}\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"tags\": \"example leaflet geometry\",\n \"text\": \"This tiddler contains\\n\\n* a two `points` list : 52.799933,-2.589812 52.799959,-2.590939\\n* a `polygon` : 52.800608,-2.591668 52.800225,-2.591829 52.799849 (...)\\n* a `polyline`s list : 52.799382,-2.590059 52.799641,-2.588321|52.799330,-2.590048 52.799447,-2.588342|52.799265,(...)\\n\\nIt has also some styling informations\\n\\n* `color` is set to pink\\n* `style` defines a dashed 8px thick line\\n\\ngo to edit mode to see the full data fields\\n\"\n },\n \"/usr/local/lib/node_modules/tiddlywiki/plugins/sycom/leaflet/example/tiddlyWikiFrCommunity.old\": {\n \"title\": \"/usr/local/lib/node_modules/tiddlywiki/plugins/sycom/leaflet/example/tiddlyWikiFrCommunity.old\",\n \"text\": \"created: 20161025143416000\\nmodified: 20170317143416000\\ntitle: $:/plugins/sycom/leaflet/example/tiddlyWikiFrCommunity\\ntype: application/json\\ntags: example leaflet geojson\\ncolor: #dd0000\\n\\n{\\\"type\\\":\\\"FeatureCollection\\\",\\\"features\\\":[{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Aknar\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[1.4442090000000007,43.604652]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"CdriC\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[-0.563166,47.478419]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Disanv Parean\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[-0.4072784,49.1846226]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Fab13n\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[5.5867,45.1184]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Fabio\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[1.916515000000004,47.8664401]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Florent V.\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[0.156237,45.648377]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Joël\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[4.740042686462402,46.10446454226022]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Johanne\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[-74.09016960000002,45.65189590000001]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Lakemp\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[2.19249,48.59338]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"LauDai\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[1.4750973000000158,43.5664556]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Lucivam\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[4.390278,45.434722]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Mikabi\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[1.44,43.604652]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Nico\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[2.2569674000000077,48.9899655]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Nicolas Friedli\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[6.8411643,46.9425711]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Phil\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[3.98337,50.36155]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Piwig\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[-1.677793,48.117266]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Sylvain Comte\\\",\\\"description\\\":\\\"Créateur du leaflet map plugin\\\",\\\"url\\\":\\\"http://sylvain.comte.online.fr\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[1.08954,49.43584]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Sylvain Naudin\\\",\\\"description\\\":\\\"Admin du forum\\\",\\\"url\\\":\\\"http://sylvain.naud.in\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[-0.155689,45.471894]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Thierry Pasquier\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[0.3333,46.5833]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Vincent Delcros\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[5.2788245000000416,50.5500944]}}]}\\n\",\n \"type\": \".old\"\n },\n \"$:/plugins/sycom/leaflet/example/tiddlyWikiFrCommunity\": {\n \"title\": \"$:/plugins/sycom/leaflet/example/tiddlyWikiFrCommunity\",\n \"text\": \"{\\\"type\\\":\\\"FeatureCollection\\\",\\\"features\\\":[{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Aknar\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[1.4442090000000007,43.604652]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"CdriC\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[-0.563166,47.478419]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Disanv Parean\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[-0.4072784,49.1846226]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Emmanuel\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[2.3522219000000177,48.85661400000001]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Escrivant\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[2.3868,48.871958]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Fab13n\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[5.5867,45.1184]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Fabio\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[1.916515000000004,47.8664401]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Florent\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[0.156237,45.648377]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"François\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[1.478413899999964,43.543794]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Gub\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[1.4442090000000007,43.604652]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"jargenty\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[1.321621999999934,43.514707]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Jérôme\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[-2.429759,47.328003]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Joël\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[4.740042686462402,46.10446454226022]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Johanne\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[-74.09016960000002,45.65189590000001]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Lakemp\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[2.19249,48.59338]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"LauDai\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[1.4750973000000158,43.5664556]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"LongSlowBakery\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[-2.4834849999999733,52.903552]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Lucivam\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[4.390278,45.434722]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"m4dz\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[2.3522219000000177,48.85661400000001]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Matthias\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[-0.560016,47.470006]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Michel\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[7.261953199999994,43.7101728]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Mikabi\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[1.44,43.604652]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Nico\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[2.2569674000000077,48.9899655]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Nicolas\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[6.8411643,46.9425711]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"pariswiki\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[2.29,48.8]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Phil\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[3.98337,50.36155]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Piwig\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[-1.677793,48.117266]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Ploum\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[0.1995560000000296,48.00611000000001]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Scapharnaum\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[7.74553,48.58392]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Solaine\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[8.227512,46.818188]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Sylvain Comte\\\",\\\"description\\\":\\\"Créateur du leaflet map plugin\\\",\\\"url\\\":\\\"http://sylvain.comte.online.fr\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[1.08954,49.43584]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Sylvain Naudin\\\",\\\"description\\\":\\\"Admin du forum\\\",\\\"url\\\":\\\"http://sylvain.naud.in\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[-0.155689,45.471894]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Thierry\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[0.3333,46.5833]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Thomas Elmiger\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[8.541694,47.376887]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Vincent\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[5.2788245000000416,50.5500944]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"name\\\":\\\"Yan\\\",\\\"description\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"geometry\\\":{\\\"type\\\":\\\"Point\\\",\\\"coordinates\\\":[2.0517,46.22475]}}]}\\n\",\n \"type\": \"application/json\",\n \"created\": \"20161025143416000\",\n \"modified\": \"20180602193416000\",\n \"source\": \"https://umap.openstreetmap.fr/fr/map/tiddlywikifr_65983\",\n \"tags\": \"example leaflet geojson\",\n \"color\": \"#dd0000\"\n },\n \"$:/ext/modules/widgets/geolocation-widget.js\": {\n \"text\": \"/*\\\\\\ntitle: $:/ext/modules/wigets/geolocation-widget.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nGeolocation widget\\n\\n\\\\*/\\n(function() {\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n \\\"use strict\\\";\\n var Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n var GeolocationWidget = function(parseTreeNode, options) {\\n this.initialise(parseTreeNode, options);\\n };\\n\\n /* Inherit from the base widget class */\\n GeolocationWidget.prototype = new Widget();\\n\\n /* Compute the internal state of the widget */\\n GeolocationWidget.prototype.execute = function() {\\n // Get attributes\\n this.target = this.getAttribute(\\\"target\\\") || this.getVariable(\\\"currentTiddler\\\");\\n this.icon = this.getAttribute(\\\"icon\\\") || \\\"$:/core/images/globe\\\";\\n this.text = this.getAttribute(\\\"text\\\") || undefined;\\n this.accuracy = this.getAttribute(\\\"accuracy\\\");\\n this.type = this.getAttribute(\\\"type\\\") || \\\"point\\\";\\n // Make child widgets\\n this.makeChildWidgets();\\n };\\n\\n /* Render this widget into the DOM */\\n GeolocationWidget.prototype.render = function(parent, nextSibling) {\\n var self = this;\\n // Remember parent\\n this.parentDomNode = parent;\\n // Compute attributes and execute state\\n this.computeAttributes();\\n this.execute();\\n // Create element\\n var tag = \\\"button\\\";\\n if (this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\\n tag = this.buttonTag;\\n }\\n var domNode = this.document.createElement(tag);\\n // Add a click event handler\\n domNode.addEventListener(\\\"click\\\", function(event) {\\n if (navigator.geolocation) {\\n navigator.geolocation.getCurrentPosition(\\n // success callback\\n function(position) {\\n /* to replace by field populating (point(s) polyline(s) or polygon(s)) */\\n /* default : if tiddler has point field, will create a points field to store new data;\\n if tiddler has points field, will add a new point to the tiddler field;\\t*/\\n var target = self.target;\\n var accuracy = self.accuracy;\\n var type = self.type;\\n var newPoint = position.coords.latitude + \\\",\\\" + position.coords.longitude;\\n /* check if tiddler has a geofield */\\n var track = \\\"\\\";\\n if (!$tw.wiki.getTiddler(target)) $tw.wiki.setText(target, \\\"text\\\", null, \\\"\\\", null);\\n var flds = $tw.wiki.getTiddler(target).fields\\n if (flds.points) {\\n track = flds.points;\\n $tw.wiki.setText(target, \\\"points\\\", null, track + \\\" \\\" + newPoint, null);\\n infoLocation(\\\"new point \\\" + newPoint + \\\" added to \\\" + target);\\n\\n } else {\\n if (flds.point && flds.point !== null) {\\n track = flds.point;\\n $tw.wiki.setText(target, \\\"points\\\", null, track + \\\" \\\" + newPoint, null);\\n $tw.wiki.setText(target, \\\"point\\\", null, null, null);\\n infoLocation(\\\"new point \\\" + newPoint + \\\" added to \\\" + target);\\n } else {\\n $tw.wiki.setText(target, \\\"point\\\", null, newPoint, null);\\n infoLocation(\\\"new point \\\" + newPoint + \\\" added to \\\" + target);\\n }\\n }\\n },\\n // error callback\\n function(error) {\\n noLocation(error.message + \\\". You may not are connected via httpS://\\\")\\n }\\n );\\n } else {\\n noLocation(\\\"position disabled or not supported by your browser\\\");\\n }\\n }, false);\\n /* dress up button */\\n var buttonContent;\\n // if text parameter, will use it for the button\\n if (self.text) {\\n buttonContent = self.text;\\n } else {\\n // if not, looking for an icon\\n /* !todo: ?question: should the icon depend on \\\"type\\\" parameter? */\\n buttonContent = $tw.wiki.getTiddler(self.icon).fields.text;\\n }\\n domNode.innerHTML = buttonContent;\\n // Insert element\\n parent.insertBefore(domNode, nextSibling);\\n this.renderChildren(domNode, null);\\n this.domNodes.push(domNode);\\n };\\n\\n function noLocation(message) {\\n /* !todo: ?question: replace by \\\"modal\\\" alert? */\\n // create or update a temporary message tiddler \\n $tw.wiki.setText(\\\"$:/temp/noLocationMessage\\\", \\\"text\\\", null, \\\"geolocation access denied: \\\" + message, null);\\n // displays it in modal\\n $tw.modal.display(\\\"$:/temp/noLocationMessage\\\");\\n }\\n\\n function infoLocation(message) {\\n // create or update a temporary message tiddler \\n $tw.wiki.setText(\\\"$:/temp/viewLocationMessage\\\", \\\"text\\\", null, message, null);\\n // displays it in modal\\n $tw.notifier.display(\\\"$:/temp/viewLocationMessage\\\");\\n }\\n /*\\n We don't allow actions to propagate because we trigger actions ourselves\\n */\\n GeolocationWidget.prototype.allowActionPropagation = function() {\\n return false;\\n };\\n\\n exports.geoloc = GeolocationWidget;\\n\\n})();\",\n \"title\": \"$:/ext/modules/widgets/geolocation-widget.js\",\n \"type\": \"application/javascript\",\n \"module-type\": \"widget\"\n },\n \"geoLocationWidget\": {\n \"caption\": \"action-createtiddler\",\n \"created\": \"20180906130958091\",\n \"modified\": \"20180906132645752\",\n \"author\": \"Sylvain Comte\",\n \"tags\": \"Widgets\",\n \"title\": \"geoLocationWidget\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"! Introduction\\nThe ''geolocation'' widget is used to collect geographic position of the browser running the wiki. For now position will be added the //point// (or //points// if there is more than one point) field of the target tiddler. Those fields may then be used with the [[Leaflet Map Plugin|https://sycom.github.io/TiddlyWiki-Plugins/#Leaflet%20plugin]], or whatever tool using geographic coordinates.\\n\\n* The widget is not dependant from Leaflet Map Plugin (but is bundled in it). You may install it alone\\n* The widget will only work on //https// website, due to security limitation of the geolocation implemented in browsers\\n\\n! Content and Attributes\\nThe [[geolocation widget|$:/ext/modules/widgets/geolocation-widget.js]] will create a button to collect your browser's position. Any content within it is ignored.\\n\\n| !Attribute | !Description | !Default |\\n|target |The tiddler (title) in which data will be stored |//current tiddler// |\\n|icon |The title of the icon used to dress up the button|$:/core/images/globe |\\n|text |The text displayed in the button (will overwrite the icon)|`undefined` |\\n\\nMore options will come later (//accuracy//, //object type//...).\\n\\n! Examples\\n\\n```\\n\u003C$geoloc target=\\\"Geolocation Store\\\" />\\n```\\n\\n\u003C$geoloc target=\\\"Geolocation Store\\\" />\\n\\n! Source\\nThe ''geolocation widget'' is developped aside Leaflet Map Plugin. Source code can be found on the same repository : https://framagit.org/sycom/TiddlyWiki-Plugins/tree/master/ext/modules/widget/geolocation\\n\\n\"\n },\n \"$:/plugins/sycom/leaflet/icon\": {\n \"title\": \"$:/plugins/sycom/leaflet/icon\",\n \"tags\": \"$:/tags/Image\",\n \"text\": \"\u003Csvg class=\\\"tc-image-leaflet-map tc-image-button\\\" viewBox=\\\"0 0 128 128\\\" width=\\\"22pt\\\" height=\\\"22pt\\\">\\n \u003Cg fill-rule=\\\"evenodd\\\">\\n \u003Cpath d=\\\"M64 0L9.4 32v64L64 128l54.6-32V32zM48.8 32.4l30.8 7.8V95l-30.8-7.8zm57.2 2.4v54.7L82 95V40.2zm-59.8-2.2v54.7L21 92.8V38zm-10.4 5.9a5.2 5.2 0 0 0-5.1 5c0 1.1.6 2.6 1.1 3.6l4 7.6 3.9-7.6c.4-1 1.1-2.4 1.1-3.6 0-2.6-2.3-5-5-5zm-.2 3h.2c1 0 2 .9 2 2a2 2 0 0 1-2 2 2 2 0 0 1-2-2c0-1 .8-2 1.8-2zM64.2 44c-7 0-13 6.1-13 12.7 0 3 1.7 6.8 3 9.4l10 19.3L74 66c1.2-2.6 3-6.2 3-9.4C77 50.1 71.2 44 64 44zm0 7.7a5 5 0 0 1 5 5 5 5 0 0 1-10 0 5 5 0 0 1 5-5zM25.6 59a3.5 3.5 0 0 0-3.4 3.3c0 .8.5 1.8.8 2.5l2.6 5 2.6-5c.3-.7.8-1.7.8-2.5 0-1.7-1.5-3.3-3.4-3.3zm0 2a1.3 1.3 0 1 1 0 2.6 1.3 1.3 0 0 1-1.3-1.3 1.3 1.3 0 0 1 1.3-1.3zM92 66.8c-2.7 0-5 2.4-5 5 0 1.2.6 2.7 1.1 3.7l4 7.5 3.8-7.5c.5-1 1.2-2.4 1.2-3.7 0-2.6-2.3-5-5-5zm0 3c1.1 0 2 1 2 2a2 2 0 0 1-2 2 2 2 0 0 1-2-2c0-1 .9-1.9 2-2z\\\"/>\\n \u003Cpath d=\\\"M69-158h58v67H69z\\\" fill=\\\"#fff\\\"/>\\n \u003C/g>\\n\u003C/svg>\\n\"\n },\n \"$:/plugins/sycom/leaflet/images/layers.svg\": {\n \"title\": \"$:/plugins/sycom/leaflet/images/layers.svg\",\n \"text\": \"\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" height=\\\"26\\\" width=\\\"26\\\">\u003Cpath d=\\\"M0 17l13-8 13 8-13 8-13-8\\\" fill=\\\"#b9b9b9\\\"/>\u003Cpath d=\\\"M0 17v1l13 8 13-8v-1l-13 8z\\\" fill=\\\"#737373\\\"/>\u003Cpath d=\\\"M0 13l13-8 13 8-13 8-13-8\\\" fill=\\\"#cdcdcd\\\"/>\\n \u003Cpath d=\\\"M0 13v1l13 8 13-8v-1l-13 8z\\\" fill=\\\"#737373\\\"/>\u003Cpath d=\\\"M0 9l13-8 13 8-13 8L0 9\\\" fill-opacity=\\\".6\\\" fill=\\\"#e9e9e9\\\"/>\u003Cpath d=\\\"M0 9v1l13 8 13-8V9l-13 8z\\\" fill=\\\"#737373\\\"/>\u003C/svg>\\n\",\n \"type\": \"image/svg+xml\",\n \"created\": \"20161028202401905\",\n \"modified\": \"20180531154011600\",\n \"tags\": \"$:/tags/Image\"\n },\n \"$:/plugins/sycom/leaflet/images/marker.svg\": {\n \"title\": \"$:/plugins/sycom/leaflet/images/marker.svg\",\n \"text\": \"\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"25\\\" height=\\\"40\\\" fill-rule=\\\"evenodd\\\">\u003Cpath fill=\\\"none\\\" d=\\\"M6.279 4.463h12.625v14.5H6.279z\\\"/>\u003Cpath fill=\\\"$primary$\\\" fill-opacity=\\\".8\\\" stroke=\\\"#fff\\\" stroke-linecap=\\\"round\\\" d=\\\"M12.544.5C5.971.5.5 6.191.5 12.366c0 2.778 1.564 6.308 2.694 8.746L12.5 38.984l9.262-17.872c1.13-2.438 2.738-5.791 2.738-8.746C24.5 6.191 19.117.5 12.544.5zm0 7.155a4.714 4.714 0 0 1 4.679 4.71c0 2.588-2.095 4.663-4.679 4.679-2.584-.017-4.679-2.09-4.679-4.679a4.714 4.714 0 0 1 4.679-4.71z\\\" class=\\\"leaflet-marker-colored\\\"/>\u003Cpath fill=\\\"none\\\" stroke=\\\"#fff\\\" stroke-linecap=\\\"round\\\" stroke-opacity=\\\".9\\\" d=\\\"M12.531 1.607c-5.944 0-10.938 5.219-10.938 10.75 0 2.359 1.443 5.832 2.563 8.25l.031.031L12.5 36.607l8.25-15.969.031-.031c1.135-2.448 2.625-5.706 2.625-8.25 0-5.538-4.931-10.75-10.875-10.75zm0 4.969c3.168.021 5.781 2.601 5.781 5.781 0 3.18-2.613 5.761-5.781 5.781-3.168-.02-5.75-2.61-5.75-5.781 0-3.172 2.582-5.761 5.75-5.781z\\\"/>\u003C/svg>\\n\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"created\": \"20161028202401905\",\n \"modified\": \"20180531124011600\",\n \"tags\": \"$:/tags/Image\",\n \"marker_dim\": \"25 40 12.5 40\",\n \"caption\": \"marker\"\n },\n \"$:/plugins/sycom/leaflet/images/markershadow.svg\": {\n \"title\": \"$:/plugins/sycom/leaflet/images/markershadow.svg\",\n \"text\": \"\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"50\\\" height=\\\"40\\\">\u003Cfilter id=\\\"a\\\" width=\\\"200\\\" height=\\\"200\\\" x=\\\"-50\\\" y=\\\"-50\\\">\u003CfeGaussianBlur in=\\\"SourceAlpha\\\" stdDeviation=\\\"1.5\\\"/>\u003C/filter>\u003Cpath fill=\\\"none\\\" d=\\\"M47 0a52 52 0 0 0-34 21L0 40l30-19 13-9c7-6 9-12 4-12zm-9 7a3 8 58 0 1-2 5c-3 3-7 5-9 5-3 0-2-2 1-5a3 8 58 0 1 10-5z\\\" filter=\\\"url(#a)\\\"/>\u003C/svg>\\n\",\n \"type\": \"image/svg+xml\",\n \"created\": \"20161028202401905\",\n \"modified\": \"20180531155500000\",\n \"tags\": \"$:/tags/Image\",\n \"marker_dim\": \"50 40 0 40\"\n },\n \"$:/plugins/sycom/leaflet/images/pin.svg\": {\n \"title\": \"$:/plugins/sycom/leaflet/images/pin.svg\",\n \"text\": \"\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"35\\\">\u003Cdefs>\u003ClinearGradient id=\\\"a\\\">\u003Cstop offset=\\\"0\\\" stop-color=\\\"#fff\\\"/>\u003Cstop offset=\\\"1\\\" stop-color=\\\"#fff\\\" stop-opacity=\\\"0\\\"/>\u003C/linearGradient>\u003CradialGradient id=\\\"b\\\" cx=\\\"7\\\" cy=\\\"7\\\" r=\\\"8\\\" fx=\\\"5\\\" fy=\\\"5\\\" gradientTransform=\\\"scale(1.12)\\\" gradientUnits=\\\"userSpaceOnUse\\\" href=\\\"#a\\\"/>\u003C/defs>\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M9 20h2v15H9z\\\"/>\u003Ccircle cx=\\\"10\\\" cy=\\\"10\\\" r=\\\"10\\\" class=\\\"leaflet-marker-colored\\\" fill-opacity=\\\".8\\\" fill=\\\"$primary$\\\"/>\u003Ccircle cx=\\\"10\\\" cy=\\\"10\\\" r=\\\"10\\\" fill=\\\"url(#b)\\\"/>\u003C/g>\u003C/svg>\\n\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"created\": \"20161028202401905\",\n \"modified\": \"20180531154500000\",\n \"tags\": \"$:/tags/Image\",\n \"marker_dim\": \"20 35 10 35\",\n \"caption\": \"pin\"\n },\n \"$:/plugins/sycom/leaflet/images/pinshadow.svg\": {\n \"title\": \"$:/plugins/sycom/leaflet/images/pinshadow.svg\",\n \"text\": \"\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"15\\\" height=\\\"15\\\">\u003Cfilter id=\\\"a\\\" width=\\\"200\\\" height=\\\"200\\\" x=\\\"-50\\\" y=\\\"-50\\\">\u003CfeGaussianBlur in=\\\"SourceAlpha\\\" stdDeviation=\\\"1.5\\\"/>\u003C/filter>\u003Cellipse cx=\\\"8\\\" cy=\\\"8\\\" style=\\\"stroke:none; fill-opacity:.3; filter: url(#a)\\\" rx=\\\"7\\\" ry=\\\"7\\\"/>\u003C/svg>\\n\",\n \"type\": \"image/svg+xml\",\n \"created\": \"20170129162401910\",\n \"modified\": \"20180531155000000\",\n \"tags\": \"$:/tags/Image\",\n \"marker_dim\": \"15 15 5 7\"\n },\n \"$:/plugins/sycom/leaflet/images/point.svg\": {\n \"title\": \"$:/plugins/sycom/leaflet/images/point.svg\",\n \"text\": \"\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"15\\\" height=\\\"15\\\" fill-rule=\\\"evenodd\\\">\u003Cellipse cx=\\\"7.5\\\" cy=\\\"7.5\\\" fill=\\\"none\\\" stroke=\\\"#fff\\\" stroke-opacity=\\\".8\\\" rx=\\\"7.5\\\" ry=\\\"7.5\\\"/>\u003Cellipse cx=\\\"7.5\\\" cy=\\\"7.5\\\" fill=\\\"$primary$\\\" fill-opacity=\\\".8\\\" stroke=\\\"#000\\\" stroke-opacity=\\\".8\\\" stroke-width=\\\".5\\\" class=\\\"leaflet-marker-colored\\\" rx=\\\"7\\\" ry=\\\"7\\\"/>\u003C/svg>\\n\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"created\": \"20170129162401905\",\n \"modified\": \"20180531165500000\",\n \"tags\": \"$:/tags/Image\",\n \"marker_dim\": \"15 15 7.5 7.5\",\n \"caption\": \"point\"\n },\n \"$:/plugins/sycom/leaflet/images/pointshadow.svg\": {\n \"title\": \"$:/plugins/sycom/leaflet/images/pointshadow.svg\",\n \"text\": \"\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"15\\\" height=\\\"15\\\">\u003Cfilter id=\\\"a\\\" width=\\\"200\\\" height=\\\"200\\\" x=\\\"-50\\\" y=\\\"-50\\\">\u003CfeGaussianBlur in=\\\"SourceAlpha\\\" stdDeviation=\\\"1.5\\\"/>\u003C/filter>\u003Cellipse cx=\\\"7.5\\\" cy=\\\"7.5\\\" fill-opacity=\\\".3\\\" filter=\\\"url(#a)\\\" rx=\\\"7.2\\\" ry=\\\"7.2\\\"/>\u003C/svg>\\n\",\n \"type\": \"image/svg+xml\",\n \"created\": \"20170129162401910\",\n \"modified\": \"20180531165600000\",\n \"tags\": \"$:/tags/Image\",\n \"marker_dim\": \"15 15 0 12\"\n },\n \"$:/plugins/sycom/leaflet/lib/tileLayers.json\": {\n \"text\": \"[\\n {\\n \\\"id\\\": \\\"osmfr\\\",\\n \\\"nom\\\": \\\"OSM France\\\",\\n \\\"url\\\": \\\"http://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png\\\",\\n \\\"attrib\\\": \\\"fond par \u003Ca href='http://osm.org/copyright'>OSM\u003C/a>, licence \u003Ca href='http://creativecommons.org/licenses/by-sa/3.0'>CC BY SA\u003C/a>. Données ©Contributeurs \u003Ca href='http://openstreetmap.org'>OSM\u003C/a>, licence \u003Ca href='http://opendatacommons.org/licenses/odbl/'>ODbL\u003C/a>.\\\",\\n \\\"zMin\\\": 1,\\n \\\"zMax\\\": 20\\n },\\n {\\n \\\"id\\\": \\\"osm\\\",\\n \\\"nom\\\": \\\"OpenStreetMap\\\",\\n \\\"url\\\": \\\"http://{s}.tile.osm.org/{z}/{x}/{y}.png\\\",\\n \\\"attrib\\\": \\\"Map tiles by ©\u003Ca href='http://osm.org/copyright'>OSM\u003C/a>, licence \u003Ca href='http://creativecommons.org/licenses/by-sa/3.0'>CC BY SA\u003C/a>. Data by ©\u003Ca href='http://openstreetmap.org'>OSM\u003C/a> contributors, licence \u003Ca href='http://opendatacommons.org/licenses/odbl/'>ODbL\u003C/a>.\\\",\\n \\\"zMin\\\": 1,\\n \\\"zMax\\\": 20\\n },\\n {\\n \\\"id\\\": \\\"osmbw\\\",\\n \\\"nom\\\": \\\"OSM N&B\\\",\\n \\\"url\\\": \\\"http://www.toolserver.org/tiles/bw-mapnik/{z}/{x}/{y}.png\\\",\\n \\\"attrib\\\": \\\"Tiles hosted by wikimedia labs. Data by ©\u003Ca href='http://openstreetmap.org'>OSM\u003C/a> contributors, licence \u003Ca href='http://opendatacommons.org/licenses/odbl/'>ODbL\u003C/a>.\\\",\\n \\\"zMin\\\": 1,\\n \\\"zMax\\\": 20\\n },\\n {\\n \\\"id\\\": \\\"sat\\\",\\n \\\"nom\\\": \\\"Satellite Esri\\\",\\n \\\"url\\\": \\\"http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}\\\",\\n \\\"attrib\\\": \\\"©Map tiles by Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community\\\",\\n \\\"zMin\\\": 1,\\n \\\"zMax\\\": 20\\n },\\n {\\n \\\"id\\\": \\\"natgeo\\\",\\n \\\"nom\\\": \\\"National Geog.\\\",\\n \\\"url\\\": \\\"http://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}\\\",\\n \\\"attrib\\\": \\\"©Map tiles by Esri — National Geographic, Esri, DeLorme, NAVTEQ, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, iPC\\\",\\n \\\"zMin\\\": 1,\\n \\\"zMax\\\": 12\\n },\\n {\\n \\\"id\\\": \\\"toner\\\",\\n \\\"nom\\\": \\\"Black Ink\\\",\\n \\\"url\\\": \\\"http://{s}.tile.stamen.com/toner/{z}/{x}/{y}.png\\\",\\n \\\"attrib\\\": \\\"Map tiles by \u003Ca href='http://stamen.com'>Stamen Design\u003C/a>, licence \u003Ca href='http://creativecommons.org/licenses/by/3.0'>CC BY 3.0\u003C/a>. Data by ©\u003Ca href='http://openstreetmap.org'>OSM\u003C/a> contributors, licence \u003Ca href='http://opendatacommons.org/licenses/odbl/'>ODbL\u003C/a>.\\\",\\n \\\"zMin\\\": 1,\\n \\\"zMax\\\": 20\\n },\\n {\\n \\\"id\\\": \\\"water\\\",\\n \\\"nom\\\": \\\"Water painting\\\",\\n \\\"url\\\": \\\"http://{s}.tile.stamen.com/watercolor/{z}/{x}/{y}.png\\\",\\n \\\"attrib\\\": \\\"Map tiles by \u003Ca href='http://stamen.com'>Stamen Design\u003C/a>, licence \u003Ca href='http://creativecommons.org/licenses/by/3.0'>CC BY 3.0\u003C/a>. Data by ©\u003Ca href='http://openstreetmap.org'>OSM\u003C/a> contributors, licence \u003Ca href='http://opendatacommons.org/licenses/odbl/'>ODbL\u003C/a>.\\\",\\n \\\"zMin\\\": 1,\\n \\\"zMax\\\": 20\\n },\\n {\\n \\\"id\\\": \\\"thunder\\\",\\n \\\"nom\\\": \\\"Thunderforest\\\",\\n \\\"url\\\": \\\"http://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png\\\",\\n \\\"attrib\\\": \\\"Map tiles by \u003Ca href='http://thunderforest.com/'>Thunderforest\u003C/a>. Data by ©\u003Ca href='http://openstreetmap.org'>OSM\u003C/a> contributors, licence \u003Ca href='http://opendatacommons.org/licenses/odbl/'>ODbL\u003C/a>.\\\",\\n \\\"zMin\\\": 1,\\n \\\"zMax\\\": 20\\n },\\n {\\n \\\"id\\\": \\\"dark\\\",\\n \\\"nom\\\": \\\"Dark Matter\\\",\\n \\\"url\\\": \\\"http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\\\",\\n \\\"attrib\\\": \\\"©Map tiles by \u003Ca href='https://cartodb.com/basemaps/' target='_blank'>CartoDB\u003C/a>, under \u003Ca href='https://creativecommons.org/licenses/by/3.0/' target='_blank'>CC BY 3.0\u003C/a>. Data by ©\u003Ca href='http://openstreetmap.org'>OSM\u003C/a> contributors, licence \u003Ca href='http://opendatacommons.org/licenses/odbl/'>ODbL\u003C/a>.\\\",\\n \\\"zMin\\\": 1,\\n \\\"zMax\\\": 20\\n },\\n {\\n \\\"id\\\": \\\"positron\\\",\\n \\\"nom\\\": \\\"Positron\\\",\\n \\\"url\\\": \\\"http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\\\",\\n \\\"attrib\\\": \\\"©Map tiles by \u003Ca href='https://cartodb.com/basemaps/' target='_blank'>CartoDB\u003C/a>, under \u003Ca href='https://creativecommons.org/licenses/by/3.0/' target='_blank'>CC BY 3.0\u003C/a>. Data by ©\u003Ca href='http://openstreetmap.org'>OSM\u003C/a> contributors, licence \u003Ca href='http://opendatacommons.org/licenses/odbl/'>ODbL\u003C/a>.\\\",\\n \\\"zMin\\\": 1,\\n \\\"zMax\\\": 20\\n }\\n]\\n\",\n \"type\": \"application/json\",\n \"title\": \"$:/plugins/sycom/leaflet/lib/tileLayers.json\"\n },\n \"$:/plugins/sycom/leaflet/lib/leaflet.css\": {\n \"text\": \"/* required styles */\\n\\n.leaflet-pane,\\n.leaflet-tile,\\n.leaflet-marker-icon,\\n.leaflet-marker-shadow,\\n.leaflet-tile-container,\\n.leaflet-pane > svg,\\n.leaflet-pane > canvas,\\n.leaflet-zoom-box,\\n.leaflet-image-layer,\\n.leaflet-layer {\\n\\tposition: absolute;\\n\\tleft: 0;\\n\\ttop: 0;\\n\\t}\\n.leaflet-container {\\n\\toverflow: hidden;\\n\\t}\\n.leaflet-tile,\\n.leaflet-marker-icon,\\n.leaflet-marker-shadow {\\n\\t-webkit-user-select: none;\\n\\t -moz-user-select: none;\\n\\t user-select: none;\\n\\t -webkit-user-drag: none;\\n\\t}\\n/* Safari renders non-retina tile on retina better with this, but Chrome is worse */\\n.leaflet-safari .leaflet-tile {\\n\\timage-rendering: -webkit-optimize-contrast;\\n\\t}\\n/* hack that prevents hw layers \\\"stretching\\\" when loading new tiles */\\n.leaflet-safari .leaflet-tile-container {\\n\\twidth: 1600px;\\n\\theight: 1600px;\\n\\t-webkit-transform-origin: 0 0;\\n\\t}\\n.leaflet-marker-icon,\\n.leaflet-marker-shadow {\\n\\tdisplay: block;\\n\\t}\\n/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */\\n/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */\\n.leaflet-container .leaflet-overlay-pane svg,\\n.leaflet-container .leaflet-marker-pane img,\\n.leaflet-container .leaflet-shadow-pane img,\\n.leaflet-container .leaflet-tile-pane img,\\n.leaflet-container img.leaflet-image-layer {\\n\\tmax-width: none !important;\\n\\tmax-height: none !important;\\n\\t}\\n\\n.leaflet-container.leaflet-touch-zoom {\\n\\t-ms-touch-action: pan-x pan-y;\\n\\ttouch-action: pan-x pan-y;\\n\\t}\\n.leaflet-container.leaflet-touch-drag {\\n\\t-ms-touch-action: pinch-zoom;\\n\\t/* Fallback for FF which doesn't support pinch-zoom */\\n\\ttouch-action: none;\\n\\ttouch-action: pinch-zoom;\\n}\\n.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {\\n\\t-ms-touch-action: none;\\n\\ttouch-action: none;\\n}\\n.leaflet-container {\\n\\t-webkit-tap-highlight-color: transparent;\\n}\\n.leaflet-container a {\\n\\t-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);\\n}\\n.leaflet-tile {\\n\\tfilter: inherit;\\n\\tvisibility: hidden;\\n\\t}\\n.leaflet-tile-loaded {\\n\\tvisibility: inherit;\\n\\t}\\n.leaflet-zoom-box {\\n\\twidth: 0;\\n\\theight: 0;\\n\\t-moz-box-sizing: border-box;\\n\\t box-sizing: border-box;\\n\\tz-index: 800;\\n\\t}\\n/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */\\n.leaflet-overlay-pane svg {\\n\\t-moz-user-select: none;\\n\\t}\\n\\n.leaflet-pane { z-index: 400; }\\n\\n.leaflet-tile-pane { z-index: 200; }\\n.leaflet-overlay-pane { z-index: 400; }\\n.leaflet-shadow-pane { z-index: 500; }\\n.leaflet-marker-pane { z-index: 600; }\\n.leaflet-tooltip-pane { z-index: 650; }\\n.leaflet-popup-pane { z-index: 700; }\\n\\n.leaflet-map-pane canvas { z-index: 100; }\\n.leaflet-map-pane svg { z-index: 200; }\\n\\n.leaflet-vml-shape {\\n\\twidth: 1px;\\n\\theight: 1px;\\n\\t}\\n.lvml {\\n\\tbehavior: url(#default#VML);\\n\\tdisplay: inline-block;\\n\\tposition: absolute;\\n\\t}\\n\\n\\n/* control positioning */\\n\\n.leaflet-control {\\n\\tposition: relative;\\n\\tz-index: 800;\\n\\tpointer-events: visiblePainted; /* IE 9-10 doesn't have auto */\\n\\tpointer-events: auto;\\n\\t}\\n.leaflet-top,\\n.leaflet-bottom {\\n\\tposition: absolute;\\n\\tz-index: 1000;\\n\\tpointer-events: none;\\n\\t}\\n.leaflet-top {\\n\\ttop: 0;\\n\\t}\\n.leaflet-right {\\n\\tright: 0;\\n\\t}\\n.leaflet-bottom {\\n\\tbottom: 0;\\n\\t}\\n.leaflet-left {\\n\\tleft: 0;\\n\\t}\\n.leaflet-control {\\n\\tfloat: left;\\n\\tclear: both;\\n\\t}\\n.leaflet-right .leaflet-control {\\n\\tfloat: right;\\n\\t}\\n.leaflet-top .leaflet-control {\\n\\tmargin-top: 10px;\\n\\t}\\n.leaflet-bottom .leaflet-control {\\n\\tmargin-bottom: 10px;\\n\\t}\\n.leaflet-left .leaflet-control {\\n\\tmargin-left: 10px;\\n\\t}\\n.leaflet-right .leaflet-control {\\n\\tmargin-right: 10px;\\n\\t}\\n\\n\\n/* zoom and fade animations */\\n\\n.leaflet-fade-anim .leaflet-tile {\\n\\twill-change: opacity;\\n\\t}\\n.leaflet-fade-anim .leaflet-popup {\\n\\topacity: 0;\\n\\t-webkit-transition: opacity 0.2s linear;\\n\\t -moz-transition: opacity 0.2s linear;\\n\\t -o-transition: opacity 0.2s linear;\\n\\t transition: opacity 0.2s linear;\\n\\t}\\n.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {\\n\\topacity: 1;\\n\\t}\\n.leaflet-zoom-animated {\\n\\t-webkit-transform-origin: 0 0;\\n\\t -ms-transform-origin: 0 0;\\n\\t transform-origin: 0 0;\\n\\t}\\n.leaflet-zoom-anim .leaflet-zoom-animated {\\n\\twill-change: transform;\\n\\t}\\n.leaflet-zoom-anim .leaflet-zoom-animated {\\n\\t-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);\\n\\t -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);\\n\\t -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1);\\n\\t transition: transform 0.25s cubic-bezier(0,0,0.25,1);\\n\\t}\\n.leaflet-zoom-anim .leaflet-tile,\\n.leaflet-pan-anim .leaflet-tile {\\n\\t-webkit-transition: none;\\n\\t -moz-transition: none;\\n\\t -o-transition: none;\\n\\t transition: none;\\n\\t}\\n\\n.leaflet-zoom-anim .leaflet-zoom-hide {\\n\\tvisibility: hidden;\\n\\t}\\n\\n\\n/* cursors */\\n\\n.leaflet-interactive {\\n\\tcursor: pointer;\\n\\t}\\n.leaflet-grab {\\n\\tcursor: -webkit-grab;\\n\\tcursor: -moz-grab;\\n\\t}\\n.leaflet-crosshair,\\n.leaflet-crosshair .leaflet-interactive {\\n\\tcursor: crosshair;\\n\\t}\\n.leaflet-popup-pane,\\n.leaflet-control {\\n\\tcursor: auto;\\n\\t}\\n.leaflet-dragging .leaflet-grab,\\n.leaflet-dragging .leaflet-grab .leaflet-interactive,\\n.leaflet-dragging .leaflet-marker-draggable {\\n\\tcursor: move;\\n\\tcursor: -webkit-grabbing;\\n\\tcursor: -moz-grabbing;\\n\\t}\\n\\n/* marker & overlays interactivity */\\n.leaflet-marker-icon,\\n.leaflet-marker-shadow,\\n.leaflet-image-layer,\\n.leaflet-pane > svg path,\\n.leaflet-tile-container {\\n\\tpointer-events: none;\\n\\t}\\n\\n.leaflet-marker-icon.leaflet-interactive,\\n.leaflet-image-layer.leaflet-interactive,\\n.leaflet-pane > svg path.leaflet-interactive {\\n\\tpointer-events: visiblePainted; /* IE 9-10 doesn't have auto */\\n\\tpointer-events: auto;\\n\\t}\\n\\n/* visual tweaks */\\n\\n.leaflet-container {\\n\\tbackground: #ddd;\\n\\toutline: 0;\\n\\t}\\n.leaflet-container a {\\n\\tcolor: #0078A8;\\n\\t}\\n.leaflet-container a.leaflet-active {\\n\\toutline: 2px solid orange;\\n\\t}\\n.leaflet-zoom-box {\\n\\tborder: 2px dotted #38f;\\n\\tbackground: rgba(255,255,255,0.5);\\n\\t}\\n\\n\\n/* general typography */\\n.leaflet-container {\\n\\tfont: 12px/1.5 \\\"Helvetica Neue\\\", Arial, Helvetica, sans-serif;\\n\\t}\\n\\n\\n/* general toolbar styles */\\n\\n.leaflet-bar {\\n\\tbox-shadow: 0 1px 5px rgba(0,0,0,0.65);\\n\\tborder-radius: 4px;\\n\\t}\\n.leaflet-bar a,\\n.leaflet-bar a:hover {\\n\\tbackground-color: #fff;\\n\\tborder-bottom: 1px solid #ccc;\\n\\twidth: 26px;\\n\\theight: 26px;\\n\\tline-height: 26px;\\n\\tdisplay: block;\\n\\ttext-align: center;\\n\\ttext-decoration: none;\\n\\tcolor: black;\\n\\t}\\n.leaflet-bar a,\\n.leaflet-control-layers-toggle {\\n\\tbackground-position: 50% 50%;\\n\\tbackground-repeat: no-repeat;\\n\\tdisplay: block;\\n\\t}\\n.leaflet-bar a:hover {\\n\\tbackground-color: #f4f4f4;\\n\\t}\\n.leaflet-bar a:first-child {\\n\\tborder-top-left-radius: 4px;\\n\\tborder-top-right-radius: 4px;\\n\\t}\\n.leaflet-bar a:last-child {\\n\\tborder-bottom-left-radius: 4px;\\n\\tborder-bottom-right-radius: 4px;\\n\\tborder-bottom: none;\\n\\t}\\n.leaflet-bar a.leaflet-disabled {\\n\\tcursor: default;\\n\\tbackground-color: #f4f4f4;\\n\\tcolor: #bbb;\\n\\t}\\n\\n.leaflet-touch .leaflet-bar a {\\n\\twidth: 30px;\\n\\theight: 30px;\\n\\tline-height: 30px;\\n\\t}\\n.leaflet-touch .leaflet-bar a:first-child {\\n\\tborder-top-left-radius: 2px;\\n\\tborder-top-right-radius: 2px;\\n\\t}\\n.leaflet-touch .leaflet-bar a:last-child {\\n\\tborder-bottom-left-radius: 2px;\\n\\tborder-bottom-right-radius: 2px;\\n\\t}\\n\\n/* zoom control */\\n\\n.leaflet-control-zoom-in,\\n.leaflet-control-zoom-out {\\n\\tfont: bold 18px 'Lucida Console', Monaco, monospace;\\n\\ttext-indent: 1px;\\n\\t}\\n\\n.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {\\n\\tfont-size: 22px;\\n\\t}\\n\\n\\n/* layers control */\\n\\n.leaflet-control-layers {\\n\\tbox-shadow: 0 1px 5px rgba(0,0,0,0.4);\\n\\tbackground: #fff;\\n\\tborder-radius: 5px;\\n\\t}\\n.leaflet-control-layers-toggle {\\n\\tbackground-image: url(images/layers.png);\\n\\twidth: 36px;\\n\\theight: 36px;\\n\\t}\\n.leaflet-retina .leaflet-control-layers-toggle {\\n\\tbackground-image: url(images/layers-2x.png);\\n\\tbackground-size: 26px 26px;\\n\\t}\\n.leaflet-touch .leaflet-control-layers-toggle {\\n\\twidth: 44px;\\n\\theight: 44px;\\n\\t}\\n.leaflet-control-layers .leaflet-control-layers-list,\\n.leaflet-control-layers-expanded .leaflet-control-layers-toggle {\\n\\tdisplay: none;\\n\\t}\\n.leaflet-control-layers-expanded .leaflet-control-layers-list {\\n\\tdisplay: block;\\n\\tposition: relative;\\n\\t}\\n.leaflet-control-layers-expanded {\\n\\tpadding: 6px 10px 6px 6px;\\n\\tcolor: #333;\\n\\tbackground: #fff;\\n\\t}\\n.leaflet-control-layers-scrollbar {\\n\\toverflow-y: scroll;\\n\\toverflow-x: hidden;\\n\\tpadding-right: 5px;\\n\\t}\\n.leaflet-control-layers-selector {\\n\\tmargin-top: 2px;\\n\\tposition: relative;\\n\\ttop: 1px;\\n\\t}\\n.leaflet-control-layers label {\\n\\tdisplay: block;\\n\\t}\\n.leaflet-control-layers-separator {\\n\\theight: 0;\\n\\tborder-top: 1px solid #ddd;\\n\\tmargin: 5px -10px 5px -6px;\\n\\t}\\n\\n/* Default icon URLs */\\n.leaflet-default-icon-path {\\n\\tbackground-image: url(images/marker-icon.png);\\n\\t}\\n\\n\\n/* attribution and scale controls */\\n\\n.leaflet-container .leaflet-control-attribution {\\n\\tbackground: #fff;\\n\\tbackground: rgba(255, 255, 255, 0.7);\\n\\tmargin: 0;\\n\\t}\\n.leaflet-control-attribution,\\n.leaflet-control-scale-line {\\n\\tpadding: 0 5px;\\n\\tcolor: #333;\\n\\t}\\n.leaflet-control-attribution a {\\n\\ttext-decoration: none;\\n\\t}\\n.leaflet-control-attribution a:hover {\\n\\ttext-decoration: underline;\\n\\t}\\n.leaflet-container .leaflet-control-attribution,\\n.leaflet-container .leaflet-control-scale {\\n\\tfont-size: 11px;\\n\\t}\\n.leaflet-left .leaflet-control-scale {\\n\\tmargin-left: 5px;\\n\\t}\\n.leaflet-bottom .leaflet-control-scale {\\n\\tmargin-bottom: 5px;\\n\\t}\\n.leaflet-control-scale-line {\\n\\tborder: 2px solid #777;\\n\\tborder-top: none;\\n\\tline-height: 1.1;\\n\\tpadding: 2px 5px 1px;\\n\\tfont-size: 11px;\\n\\twhite-space: nowrap;\\n\\toverflow: hidden;\\n\\t-moz-box-sizing: border-box;\\n\\t box-sizing: border-box;\\n\\n\\tbackground: #fff;\\n\\tbackground: rgba(255, 255, 255, 0.5);\\n\\t}\\n.leaflet-control-scale-line:not(:first-child) {\\n\\tborder-top: 2px solid #777;\\n\\tborder-bottom: none;\\n\\tmargin-top: -2px;\\n\\t}\\n.leaflet-control-scale-line:not(:first-child):not(:last-child) {\\n\\tborder-bottom: 2px solid #777;\\n\\t}\\n\\n.leaflet-touch .leaflet-control-attribution,\\n.leaflet-touch .leaflet-control-layers,\\n.leaflet-touch .leaflet-bar {\\n\\tbox-shadow: none;\\n\\t}\\n.leaflet-touch .leaflet-control-layers,\\n.leaflet-touch .leaflet-bar {\\n\\tborder: 2px solid rgba(0,0,0,0.2);\\n\\tbackground-clip: padding-box;\\n\\t}\\n\\n\\n/* popup */\\n\\n.leaflet-popup {\\n\\tposition: absolute;\\n\\ttext-align: center;\\n\\tmargin-bottom: 20px;\\n\\t}\\n.leaflet-popup-content-wrapper {\\n\\tpadding: 1px;\\n\\ttext-align: left;\\n\\tborder-radius: 12px;\\n\\t}\\n.leaflet-popup-content {\\n\\tmargin: 13px 19px;\\n\\tline-height: 1.4;\\n\\t}\\n.leaflet-popup-content p {\\n\\tmargin: 18px 0;\\n\\t}\\n.leaflet-popup-tip-container {\\n\\twidth: 40px;\\n\\theight: 20px;\\n\\tposition: absolute;\\n\\tleft: 50%;\\n\\tmargin-left: -20px;\\n\\toverflow: hidden;\\n\\tpointer-events: none;\\n\\t}\\n.leaflet-popup-tip {\\n\\twidth: 17px;\\n\\theight: 17px;\\n\\tpadding: 1px;\\n\\n\\tmargin: -10px auto 0;\\n\\n\\t-webkit-transform: rotate(45deg);\\n\\t -moz-transform: rotate(45deg);\\n\\t -ms-transform: rotate(45deg);\\n\\t -o-transform: rotate(45deg);\\n\\t transform: rotate(45deg);\\n\\t}\\n.leaflet-popup-content-wrapper,\\n.leaflet-popup-tip {\\n\\tbackground: white;\\n\\tcolor: #333;\\n\\tbox-shadow: 0 3px 14px rgba(0,0,0,0.4);\\n\\t}\\n.leaflet-container a.leaflet-popup-close-button {\\n\\tposition: absolute;\\n\\ttop: 0;\\n\\tright: 0;\\n\\tpadding: 4px 4px 0 0;\\n\\tborder: none;\\n\\ttext-align: center;\\n\\twidth: 18px;\\n\\theight: 14px;\\n\\tfont: 16px/14px Tahoma, Verdana, sans-serif;\\n\\tcolor: #c3c3c3;\\n\\ttext-decoration: none;\\n\\tfont-weight: bold;\\n\\tbackground: transparent;\\n\\t}\\n.leaflet-container a.leaflet-popup-close-button:hover {\\n\\tcolor: #999;\\n\\t}\\n.leaflet-popup-scrolled {\\n\\toverflow: auto;\\n\\tborder-bottom: 1px solid #ddd;\\n\\tborder-top: 1px solid #ddd;\\n\\t}\\n\\n.leaflet-oldie .leaflet-popup-content-wrapper {\\n\\tzoom: 1;\\n\\t}\\n.leaflet-oldie .leaflet-popup-tip {\\n\\twidth: 24px;\\n\\tmargin: 0 auto;\\n\\n\\t-ms-filter: \\\"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)\\\";\\n\\tfilter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);\\n\\t}\\n.leaflet-oldie .leaflet-popup-tip-container {\\n\\tmargin-top: -1px;\\n\\t}\\n\\n.leaflet-oldie .leaflet-control-zoom,\\n.leaflet-oldie .leaflet-control-layers,\\n.leaflet-oldie .leaflet-popup-content-wrapper,\\n.leaflet-oldie .leaflet-popup-tip {\\n\\tborder: 1px solid #999;\\n\\t}\\n\\n\\n/* div icon */\\n\\n.leaflet-div-icon {\\n\\tbackground: #fff;\\n\\tborder: 1px solid #666;\\n\\t}\\n\\n\\n/* Tooltip */\\n/* Base styles for the element that has a tooltip */\\n.leaflet-tooltip {\\n\\tposition: absolute;\\n\\tpadding: 6px;\\n\\tbackground-color: #fff;\\n\\tborder: 1px solid #fff;\\n\\tborder-radius: 3px;\\n\\tcolor: #222;\\n\\twhite-space: nowrap;\\n\\t-webkit-user-select: none;\\n\\t-moz-user-select: none;\\n\\t-ms-user-select: none;\\n\\tuser-select: none;\\n\\tpointer-events: none;\\n\\tbox-shadow: 0 1px 3px rgba(0,0,0,0.4);\\n\\t}\\n.leaflet-tooltip.leaflet-clickable {\\n\\tcursor: pointer;\\n\\tpointer-events: auto;\\n\\t}\\n.leaflet-tooltip-top:before,\\n.leaflet-tooltip-bottom:before,\\n.leaflet-tooltip-left:before,\\n.leaflet-tooltip-right:before {\\n\\tposition: absolute;\\n\\tpointer-events: none;\\n\\tborder: 6px solid transparent;\\n\\tbackground: transparent;\\n\\tcontent: \\\"\\\";\\n\\t}\\n\\n/* Directions */\\n\\n.leaflet-tooltip-bottom {\\n\\tmargin-top: 6px;\\n}\\n.leaflet-tooltip-top {\\n\\tmargin-top: -6px;\\n}\\n.leaflet-tooltip-bottom:before,\\n.leaflet-tooltip-top:before {\\n\\tleft: 50%;\\n\\tmargin-left: -6px;\\n\\t}\\n.leaflet-tooltip-top:before {\\n\\tbottom: 0;\\n\\tmargin-bottom: -12px;\\n\\tborder-top-color: #fff;\\n\\t}\\n.leaflet-tooltip-bottom:before {\\n\\ttop: 0;\\n\\tmargin-top: -12px;\\n\\tmargin-left: -6px;\\n\\tborder-bottom-color: #fff;\\n\\t}\\n.leaflet-tooltip-left {\\n\\tmargin-left: -6px;\\n}\\n.leaflet-tooltip-right {\\n\\tmargin-left: 6px;\\n}\\n.leaflet-tooltip-left:before,\\n.leaflet-tooltip-right:before {\\n\\ttop: 50%;\\n\\tmargin-top: -6px;\\n\\t}\\n.leaflet-tooltip-left:before {\\n\\tright: 0;\\n\\tmargin-right: -12px;\\n\\tborder-left-color: #fff;\\n\\t}\\n.leaflet-tooltip-right:before {\\n\\tleft: 0;\\n\\tmargin-left: -12px;\\n\\tborder-right-color: #fff;\\n\\t}\\n\",\n \"type\": \"text/css\",\n \"title\": \"$:/plugins/sycom/leaflet/lib/leaflet.css\",\n \"tags\": \"$:/tags/Stylesheet\"\n },\n \"$:/plugins/sycom/leaflet/lib/leaflet-markercluster.css\": {\n \"text\": \".leaflet-cluster-anim .leaflet-marker-icon, .leaflet-cluster-anim .leaflet-marker-shadow {\\n\\t-webkit-transition: -webkit-transform 0.3s ease-out, opacity 0.3s ease-in;\\n\\t-moz-transition: -moz-transform 0.3s ease-out, opacity 0.3s ease-in;\\n\\t-o-transition: -o-transform 0.3s ease-out, opacity 0.3s ease-in;\\n\\ttransition: transform 0.3s ease-out, opacity 0.3s ease-in;\\n}\\n\\n.leaflet-cluster-spider-leg {\\n\\t/* stroke-dashoffset (duration and function) should match with leaflet-marker-icon transform in order to track it exactly */\\n\\t-webkit-transition: -webkit-stroke-dashoffset 0.3s ease-out, -webkit-stroke-opacity 0.3s ease-in;\\n\\t-moz-transition: -moz-stroke-dashoffset 0.3s ease-out, -moz-stroke-opacity 0.3s ease-in;\\n\\t-o-transition: -o-stroke-dashoffset 0.3s ease-out, -o-stroke-opacity 0.3s ease-in;\\n\\ttransition: stroke-dashoffset 0.3s ease-out, stroke-opacity 0.3s ease-in;\\n}\\n\",\n \"type\": \"text/css\",\n \"title\": \"$:/plugins/sycom/leaflet/lib/leaflet-markercluster.css\",\n \"tags\": \"$:/tags/Stylesheet\"\n },\n \"$:/plugins/sycom/leaflet/lib/leaflet.js\": {\n \"text\": \"var L;if($tw.browser){\\n/* @preserve\\n * Leaflet 1.3.1, a JS library for interactive maps. http://leafletjs.com\\n * (c) 2010-2017 Vladimir Agafonkin, (c) 2010-2011 CloudMade\\n */\\n!function(t,i){\\\"object\\\"==typeof exports&&\\\"undefined\\\"!=typeof module?i(exports):\\\"function\\\"==typeof define&&define.amd?define([\\\"exports\\\"],i):i(t.L={})}(this,function(t){\\\"use strict\\\";function i(t){var i,e,n,o;for(e=1,n=arguments.length;e\u003Cn;e++){o=arguments[e];for(i in o)t[i]=o[i]}return t}function e(t,i){var e=Array.prototype.slice;if(t.bind)return t.bind.apply(t,e.call(arguments,1));var n=e.call(arguments,2);return function(){return t.apply(i,n.length?n.concat(e.call(arguments)):arguments)}}function n(t){return t._leaflet_id=t._leaflet_id||++ti,t._leaflet_id}function o(t,i,e){var n,o,s,r;return r=function(){n=!1,o&&(s.apply(e,o),o=!1)},s=function(){n?o=arguments:(t.apply(e,arguments),setTimeout(r,i),n=!0)}}function s(t,i,e){var n=i[1],o=i[0],s=n-o;return t===n&&e?t:((t-o)%s+s)%s+o}function r(){return!1}function a(t,i){var e=Math.pow(10,void 0===i?6:i);return Math.round(t*e)/e}function h(t){return t.trim?t.trim():t.replace(/^\\\\s+|\\\\s+$/g,\\\"\\\")}function u(t){return h(t).split(/\\\\s+/)}function l(t,i){t.hasOwnProperty(\\\"options\\\")||(t.options=t.options?Qt(t.options):{});for(var e in i)t.options[e]=i[e];return t.options}function c(t,i,e){var n=[];for(var o in t)n.push(encodeURIComponent(e?o.toUpperCase():o)+\\\"=\\\"+encodeURIComponent(t[o]));return(i&&-1!==i.indexOf(\\\"?\\\")?\\\"&\\\":\\\"?\\\")+n.join(\\\"&\\\")}function _(t,i){return t.replace(ii,function(t,e){var n=i[e];if(void 0===n)throw new Error(\\\"No value provided for variable \\\"+t);return\\\"function\\\"==typeof n&&(n=n(i)),n})}function d(t,i){for(var e=0;e\u003Ct.length;e++)if(t[e]===i)return e;return-1}function p(t){return window[\\\"webkit\\\"+t]||window[\\\"moz\\\"+t]||window[\\\"ms\\\"+t]}function m(t){var i=+new Date,e=Math.max(0,16-(i-oi));return oi=i+e,window.setTimeout(t,e)}function f(t,i,n){if(!n||si!==m)return si.call(window,e(t,i));t.call(i)}function g(t){t&&ri.call(window,t)}function v(){}function y(t){if(\\\"undefined\\\"!=typeof L&&L&&L.Mixin){t=ei(t)?t:[t];for(var i=0;i\u003Ct.length;i++)t[i]===L.Mixin.Events&&console.warn(\\\"Deprecated include of L.Mixin.Events: this property will be removed in future releases, please inherit from L.Evented instead.\\\",(new Error).stack)}}function x(t,i,e){this.x=e?Math.round(t):t,this.y=e?Math.round(i):i}function w(t,i,e){return t instanceof x?t:ei(t)?new x(t[0],t[1]):void 0===t||null===t?t:\\\"object\\\"==typeof t&&\\\"x\\\"in t&&\\\"y\\\"in t?new x(t.x,t.y):new x(t,i,e)}function P(t,i){if(t)for(var e=i?[t,i]:t,n=0,o=e.length;n\u003Co;n++)this.extend(e[n])}function b(t,i){return!t||t instanceof P?t:new P(t,i)}function T(t,i){if(t)for(var e=i?[t,i]:t,n=0,o=e.length;n\u003Co;n++)this.extend(e[n])}function z(t,i){return t instanceof T?t:new T(t,i)}function M(t,i,e){if(isNaN(t)||isNaN(i))throw new Error(\\\"Invalid LatLng object: (\\\"+t+\\\", \\\"+i+\\\")\\\");this.lat=+t,this.lng=+i,void 0!==e&&(this.alt=+e)}function C(t,i,e){return t instanceof M?t:ei(t)&&\\\"object\\\"!=typeof t[0]?3===t.length?new M(t[0],t[1],t[2]):2===t.length?new M(t[0],t[1]):null:void 0===t||null===t?t:\\\"object\\\"==typeof t&&\\\"lat\\\"in t?new M(t.lat,\\\"lng\\\"in t?t.lng:t.lon,t.alt):void 0===i?null:new M(t,i,e)}function Z(t,i,e,n){if(ei(t))return this._a=t[0],this._b=t[1],this._c=t[2],void(this._d=t[3]);this._a=t,this._b=i,this._c=e,this._d=n}function S(t,i,e,n){return new Z(t,i,e,n)}function E(t){return document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",t)}function k(t,i){var e,n,o,s,r,a,h=\\\"\\\";for(e=0,o=t.length;e\u003Co;e++){for(n=0,s=(r=t[e]).length;n\u003Cs;n++)a=r[n],h+=(n?\\\"L\\\":\\\"M\\\")+a.x+\\\" \\\"+a.y;h+=i?Xi?\\\"z\\\":\\\"x\\\":\\\"\\\"}return h||\\\"M0 0\\\"}function I(t){return navigator.userAgent.toLowerCase().indexOf(t)>=0}function A(t,i,e,n){return\\\"touchstart\\\"===i?O(t,e,n):\\\"touchmove\\\"===i?W(t,e,n):\\\"touchend\\\"===i&&H(t,e,n),this}function B(t,i,e){var n=t[\\\"_leaflet_\\\"+i+e];return\\\"touchstart\\\"===i?t.removeEventListener(Qi,n,!1):\\\"touchmove\\\"===i?t.removeEventListener(te,n,!1):\\\"touchend\\\"===i&&(t.removeEventListener(ie,n,!1),t.removeEventListener(ee,n,!1)),this}function O(t,i,n){var o=e(function(t){if(\\\"mouse\\\"!==t.pointerType&&t.MSPOINTER_TYPE_MOUSE&&t.pointerType!==t.MSPOINTER_TYPE_MOUSE){if(!(ne.indexOf(t.target.tagName)\u003C0))return;$(t)}j(t,i)});t[\\\"_leaflet_touchstart\\\"+n]=o,t.addEventListener(Qi,o,!1),se||(document.documentElement.addEventListener(Qi,R,!0),document.documentElement.addEventListener(te,D,!0),document.documentElement.addEventListener(ie,N,!0),document.documentElement.addEventListener(ee,N,!0),se=!0)}function R(t){oe[t.pointerId]=t,re++}function D(t){oe[t.pointerId]&&(oe[t.pointerId]=t)}function N(t){delete oe[t.pointerId],re--}function j(t,i){t.touches=[];for(var e in oe)t.touches.push(oe[e]);t.changedTouches=[t],i(t)}function W(t,i,e){var n=function(t){(t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&\\\"mouse\\\"!==t.pointerType||0!==t.buttons)&&j(t,i)};t[\\\"_leaflet_touchmove\\\"+e]=n,t.addEventListener(te,n,!1)}function H(t,i,e){var n=function(t){j(t,i)};t[\\\"_leaflet_touchend\\\"+e]=n,t.addEventListener(ie,n,!1),t.addEventListener(ee,n,!1)}function F(t,i,e){function n(t){var i;if(Ui){if(!Pi||\\\"mouse\\\"===t.pointerType)return;i=re}else i=t.touches.length;if(!(i>1)){var e=Date.now(),n=e-(s||e);r=t.touches?t.touches[0]:t,a=n>0&&n\u003C=h,s=e}}function o(t){if(a&&!r.cancelBubble){if(Ui){if(!Pi||\\\"mouse\\\"===t.pointerType)return;var e,n,o={};for(n in r)e=r[n],o[n]=e&&e.bind?e.bind(r):e;r=o}r.type=\\\"dblclick\\\",i(r),s=null}}var s,r,a=!1,h=250;return t[ue+ae+e]=n,t[ue+he+e]=o,t[ue+\\\"dblclick\\\"+e]=i,t.addEventListener(ae,n,!1),t.addEventListener(he,o,!1),t.addEventListener(\\\"dblclick\\\",i,!1),this}function U(t,i){var e=t[ue+ae+i],n=t[ue+he+i],o=t[ue+\\\"dblclick\\\"+i];return t.removeEventListener(ae,e,!1),t.removeEventListener(he,n,!1),Pi||t.removeEventListener(\\\"dblclick\\\",o,!1),this}function V(t,i,e,n){if(\\\"object\\\"==typeof i)for(var o in i)G(t,o,i[o],e);else for(var s=0,r=(i=u(i)).length;s\u003Cr;s++)G(t,i[s],e,n);return this}function q(t,i,e,n){if(\\\"object\\\"==typeof i)for(var o in i)K(t,o,i[o],e);else if(i)for(var s=0,r=(i=u(i)).length;s\u003Cr;s++)K(t,i[s],e,n);else{for(var a in t[le])K(t,a,t[le][a]);delete t[le]}return this}function G(t,i,e,o){var s=i+n(e)+(o?\\\"_\\\"+n(o):\\\"\\\");if(t[le]&&t[le][s])return this;var r=function(i){return e.call(o||t,i||window.event)},a=r;Ui&&0===i.indexOf(\\\"touch\\\")?A(t,i,r,s):!Vi||\\\"dblclick\\\"!==i||!F||Ui&&Si?\\\"addEventListener\\\"in t?\\\"mousewheel\\\"===i?t.addEventListener(\\\"onwheel\\\"in t?\\\"wheel\\\":\\\"mousewheel\\\",r,!1):\\\"mouseenter\\\"===i||\\\"mouseleave\\\"===i?(r=function(i){i=i||window.event,ot(t,i)&&a(i)},t.addEventListener(\\\"mouseenter\\\"===i?\\\"mouseover\\\":\\\"mouseout\\\",r,!1)):(\\\"click\\\"===i&&Ti&&(r=function(t){st(t,a)}),t.addEventListener(i,r,!1)):\\\"attachEvent\\\"in t&&t.attachEvent(\\\"on\\\"+i,r):F(t,r,s),t[le]=t[le]||{},t[le][s]=r}function K(t,i,e,o){var s=i+n(e)+(o?\\\"_\\\"+n(o):\\\"\\\"),r=t[le]&&t[le][s];if(!r)return this;Ui&&0===i.indexOf(\\\"touch\\\")?B(t,i,s):!Vi||\\\"dblclick\\\"!==i||!U||Ui&&Si?\\\"removeEventListener\\\"in t?\\\"mousewheel\\\"===i?t.removeEventListener(\\\"onwheel\\\"in t?\\\"wheel\\\":\\\"mousewheel\\\",r,!1):t.removeEventListener(\\\"mouseenter\\\"===i?\\\"mouseover\\\":\\\"mouseleave\\\"===i?\\\"mouseout\\\":i,r,!1):\\\"detachEvent\\\"in t&&t.detachEvent(\\\"on\\\"+i,r):U(t,s),t[le][s]=null}function Y(t){return t.stopPropagation?t.stopPropagation():t.originalEvent?t.originalEvent._stopped=!0:t.cancelBubble=!0,nt(t),this}function X(t){return G(t,\\\"mousewheel\\\",Y),this}function J(t){return V(t,\\\"mousedown touchstart dblclick\\\",Y),G(t,\\\"click\\\",et),this}function $(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this}function Q(t){return $(t),Y(t),this}function tt(t,i){if(!i)return new x(t.clientX,t.clientY);var e=i.getBoundingClientRect(),n=e.width/i.offsetWidth||1,o=e.height/i.offsetHeight||1;return new x(t.clientX/n-e.left-i.clientLeft,t.clientY/o-e.top-i.clientTop)}function it(t){return Pi?t.wheelDeltaY/2:t.deltaY&&0===t.deltaMode?-t.deltaY/ce:t.deltaY&&1===t.deltaMode?20*-t.deltaY:t.deltaY&&2===t.deltaMode?60*-t.deltaY:t.deltaX||t.deltaZ?0:t.wheelDelta?(t.wheelDeltaY||t.wheelDelta)/2:t.detail&&Math.abs(t.detail)\u003C32765?20*-t.detail:t.detail?t.detail/-32765*60:0}function et(t){_e[t.type]=!0}function nt(t){var i=_e[t.type];return _e[t.type]=!1,i}function ot(t,i){var e=i.relatedTarget;if(!e)return!0;try{for(;e&&e!==t;)e=e.parentNode}catch(t){return!1}return e!==t}function st(t,i){var e=t.timeStamp||t.originalEvent&&t.originalEvent.timeStamp,n=pi&&e-pi;n&&n>100&&n\u003C500||t.target._simulatedClick&&!t._simulated?Q(t):(pi=e,i(t))}function rt(t){return\\\"string\\\"==typeof t?document.getElementById(t):t}function at(t,i){var e=t.style[i]||t.currentStyle&&t.currentStyle[i];if((!e||\\\"auto\\\"===e)&&document.defaultView){var n=document.defaultView.getComputedStyle(t,null);e=n?n[i]:null}return\\\"auto\\\"===e?null:e}function ht(t,i,e){var n=document.createElement(t);return n.className=i||\\\"\\\",e&&e.appendChild(n),n}function ut(t){var i=t.parentNode;i&&i.removeChild(t)}function lt(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function ct(t){var i=t.parentNode;i.lastChild!==t&&i.appendChild(t)}function _t(t){var i=t.parentNode;i.firstChild!==t&&i.insertBefore(t,i.firstChild)}function dt(t,i){if(void 0!==t.classList)return t.classList.contains(i);var e=gt(t);return e.length>0&&new RegExp(\\\"(^|\\\\\\\\s)\\\"+i+\\\"(\\\\\\\\s|$)\\\").test(e)}function pt(t,i){if(void 0!==t.classList)for(var e=u(i),n=0,o=e.length;n\u003Co;n++)t.classList.add(e[n]);else if(!dt(t,i)){var s=gt(t);ft(t,(s?s+\\\" \\\":\\\"\\\")+i)}}function mt(t,i){void 0!==t.classList?t.classList.remove(i):ft(t,h((\\\" \\\"+gt(t)+\\\" \\\").replace(\\\" \\\"+i+\\\" \\\",\\\" \\\")))}function ft(t,i){void 0===t.className.baseVal?t.className=i:t.className.baseVal=i}function gt(t){return void 0===t.className.baseVal?t.className:t.className.baseVal}function vt(t,i){\\\"opacity\\\"in t.style?t.style.opacity=i:\\\"filter\\\"in t.style&&yt(t,i)}function yt(t,i){var e=!1,n=\\\"DXImageTransform.Microsoft.Alpha\\\";try{e=t.filters.item(n)}catch(t){if(1===i)return}i=Math.round(100*i),e?(e.Enabled=100!==i,e.Opacity=i):t.style.filter+=\\\" progid:\\\"+n+\\\"(opacity=\\\"+i+\\\")\\\"}function xt(t){for(var i=document.documentElement.style,e=0;e\u003Ct.length;e++)if(t[e]in i)return t[e];return!1}function wt(t,i,e){var n=i||new x(0,0);t.style[pe]=(Oi?\\\"translate(\\\"+n.x+\\\"px,\\\"+n.y+\\\"px)\\\":\\\"translate3d(\\\"+n.x+\\\"px,\\\"+n.y+\\\"px,0)\\\")+(e?\\\" scale(\\\"+e+\\\")\\\":\\\"\\\")}function Lt(t,i){t._leaflet_pos=i,Ni?wt(t,i):(t.style.left=i.x+\\\"px\\\",t.style.top=i.y+\\\"px\\\")}function Pt(t){return t._leaflet_pos||new x(0,0)}function bt(){V(window,\\\"dragstart\\\",$)}function Tt(){q(window,\\\"dragstart\\\",$)}function zt(t){for(;-1===t.tabIndex;)t=t.parentNode;t.style&&(Mt(),ve=t,ye=t.style.outline,t.style.outline=\\\"none\\\",V(window,\\\"keydown\\\",Mt))}function Mt(){ve&&(ve.style.outline=ye,ve=void 0,ye=void 0,q(window,\\\"keydown\\\",Mt))}function Ct(t,i){if(!i||!t.length)return t.slice();var e=i*i;return t=kt(t,e),t=St(t,e)}function Zt(t,i,e){return Math.sqrt(Rt(t,i,e,!0))}function St(t,i){var e=t.length,n=new(typeof Uint8Array!=void 0+\\\"\\\"?Uint8Array:Array)(e);n[0]=n[e-1]=1,Et(t,n,i,0,e-1);var o,s=[];for(o=0;o\u003Ce;o++)n[o]&&s.push(t[o]);return s}function Et(t,i,e,n,o){var s,r,a,h=0;for(r=n+1;r\u003C=o-1;r++)(a=Rt(t[r],t[n],t[o],!0))>h&&(s=r,h=a);h>e&&(i[s]=1,Et(t,i,e,n,s),Et(t,i,e,s,o))}function kt(t,i){for(var e=[t[0]],n=1,o=0,s=t.length;n\u003Cs;n++)Ot(t[n],t[o])>i&&(e.push(t[n]),o=n);return o\u003Cs-1&&e.push(t[s-1]),e}function It(t,i,e,n,o){var s,r,a,h=n?Se:Bt(t,e),u=Bt(i,e);for(Se=u;;){if(!(h|u))return[t,i];if(h&u)return!1;a=Bt(r=At(t,i,s=h||u,e,o),e),s===h?(t=r,h=a):(i=r,u=a)}}function At(t,i,e,n,o){var s,r,a=i.x-t.x,h=i.y-t.y,u=n.min,l=n.max;return 8&e?(s=t.x+a*(l.y-t.y)/h,r=l.y):4&e?(s=t.x+a*(u.y-t.y)/h,r=u.y):2&e?(s=l.x,r=t.y+h*(l.x-t.x)/a):1&e&&(s=u.x,r=t.y+h*(u.x-t.x)/a),new x(s,r,o)}function Bt(t,i){var e=0;return t.x\u003Ci.min.x?e|=1:t.x>i.max.x&&(e|=2),t.y\u003Ci.min.y?e|=4:t.y>i.max.y&&(e|=8),e}function Ot(t,i){var e=i.x-t.x,n=i.y-t.y;return e*e+n*n}function Rt(t,i,e,n){var o,s=i.x,r=i.y,a=e.x-s,h=e.y-r,u=a*a+h*h;return u>0&&((o=((t.x-s)*a+(t.y-r)*h)/u)>1?(s=e.x,r=e.y):o>0&&(s+=a*o,r+=h*o)),a=t.x-s,h=t.y-r,n?a*a+h*h:new x(s,r)}function Dt(t){return!ei(t[0])||\\\"object\\\"!=typeof t[0][0]&&void 0!==t[0][0]}function Nt(t){return console.warn(\\\"Deprecated use of _flat, please use L.LineUtil.isFlat instead.\\\"),Dt(t)}function jt(t,i,e){var n,o,s,r,a,h,u,l,c,_=[1,4,2,8];for(o=0,u=t.length;o\u003Cu;o++)t[o]._code=Bt(t[o],i);for(r=0;r\u003C4;r++){for(l=_[r],n=[],o=0,s=(u=t.length)-1;o\u003Cu;s=o++)a=t[o],h=t[s],a._code&l?h._code&l||((c=At(h,a,l,i,e))._code=Bt(c,i),n.push(c)):(h._code&l&&((c=At(h,a,l,i,e))._code=Bt(c,i),n.push(c)),n.push(a));t=n}return t}function Wt(t,i){var e,n,o,s,r=\\\"Feature\\\"===t.type?t.geometry:t,a=r?r.coordinates:null,h=[],u=i&&i.pointToLayer,l=i&&i.coordsToLatLng||Ht;if(!a&&!r)return null;switch(r.type){case\\\"Point\\\":return e=l(a),u?u(t,e):new Xe(e);case\\\"MultiPoint\\\":for(o=0,s=a.length;o\u003Cs;o++)e=l(a[o]),h.push(u?u(t,e):new Xe(e));return new qe(h);case\\\"LineString\\\":case\\\"MultiLineString\\\":return n=Ft(a,\\\"LineString\\\"===r.type?0:1,l),new tn(n,i);case\\\"Polygon\\\":case\\\"MultiPolygon\\\":return n=Ft(a,\\\"Polygon\\\"===r.type?1:2,l),new en(n,i);case\\\"GeometryCollection\\\":for(o=0,s=r.geometries.length;o\u003Cs;o++){var c=Wt({geometry:r.geometries[o],type:\\\"Feature\\\",properties:t.properties},i);c&&h.push(c)}return new qe(h);default:throw new Error(\\\"Invalid GeoJSON object.\\\")}}function Ht(t){return new M(t[1],t[0],t[2])}function Ft(t,i,e){for(var n,o=[],s=0,r=t.length;s\u003Cr;s++)n=i?Ft(t[s],i-1,e):(e||Ht)(t[s]),o.push(n);return o}function Ut(t,i){return i=\\\"number\\\"==typeof i?i:6,void 0!==t.alt?[a(t.lng,i),a(t.lat,i),a(t.alt,i)]:[a(t.lng,i),a(t.lat,i)]}function Vt(t,i,e,n){for(var o=[],s=0,r=t.length;s\u003Cr;s++)o.push(i?Vt(t[s],i-1,e,n):Ut(t[s],n));return!i&&e&&o.push(o[0]),o}function qt(t,e){return t.feature?i({},t.feature,{geometry:e}):Gt(e)}function Gt(t){return\\\"Feature\\\"===t.type||\\\"FeatureCollection\\\"===t.type?t:{type:\\\"Feature\\\",properties:{},geometry:t}}function Kt(t,i){return new nn(t,i)}function Yt(t,i){return new dn(t,i)}function Xt(t){return Yi?new fn(t):null}function Jt(t){return Xi||Ji?new xn(t):null}var $t=Object.freeze;Object.freeze=function(t){return t};var Qt=Object.create||function(){function t(){}return function(i){return t.prototype=i,new t}}(),ti=0,ii=/\\\\{ *([\\\\w_-]+) *\\\\}/g,ei=Array.isArray||function(t){return\\\"[object Array]\\\"===Object.prototype.toString.call(t)},ni=\\\"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=\\\",oi=0,si=window.requestAnimationFrame||p(\\\"RequestAnimationFrame\\\")||m,ri=window.cancelAnimationFrame||p(\\\"CancelAnimationFrame\\\")||p(\\\"CancelRequestAnimationFrame\\\")||function(t){window.clearTimeout(t)},ai=(Object.freeze||Object)({freeze:$t,extend:i,create:Qt,bind:e,lastId:ti,stamp:n,throttle:o,wrapNum:s,falseFn:r,formatNum:a,trim:h,splitWords:u,setOptions:l,getParamString:c,template:_,isArray:ei,indexOf:d,emptyImageUrl:ni,requestFn:si,cancelFn:ri,requestAnimFrame:f,cancelAnimFrame:g});v.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this.callInitHooks()},n=e.__super__=this.prototype,o=Qt(n);o.constructor=e,e.prototype=o;for(var s in this)this.hasOwnProperty(s)&&\\\"prototype\\\"!==s&&\\\"__super__\\\"!==s&&(e[s]=this[s]);return t.statics&&(i(e,t.statics),delete t.statics),t.includes&&(y(t.includes),i.apply(null,[o].concat(t.includes)),delete t.includes),o.options&&(t.options=i(Qt(o.options),t.options)),i(o,t),o._initHooks=[],o.callInitHooks=function(){if(!this._initHooksCalled){n.callInitHooks&&n.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,i=o._initHooks.length;t\u003Ci;t++)o._initHooks[t].call(this)}},e},v.include=function(t){return i(this.prototype,t),this},v.mergeOptions=function(t){return i(this.prototype.options,t),this},v.addInitHook=function(t){var i=Array.prototype.slice.call(arguments,1),e=\\\"function\\\"==typeof t?t:function(){this[t].apply(this,i)};return this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(e),this};var hi={on:function(t,i,e){if(\\\"object\\\"==typeof t)for(var n in t)this._on(n,t[n],i);else for(var o=0,s=(t=u(t)).length;o\u003Cs;o++)this._on(t[o],i,e);return this},off:function(t,i,e){if(t)if(\\\"object\\\"==typeof t)for(var n in t)this._off(n,t[n],i);else for(var o=0,s=(t=u(t)).length;o\u003Cs;o++)this._off(t[o],i,e);else delete this._events;return this},_on:function(t,i,e){this._events=this._events||{};var n=this._events[t];n||(n=[],this._events[t]=n),e===this&&(e=void 0);for(var o={fn:i,ctx:e},s=n,r=0,a=s.length;r\u003Ca;r++)if(s[r].fn===i&&s[r].ctx===e)return;s.push(o)},_off:function(t,i,e){var n,o,s;if(this._events&&(n=this._events[t]))if(i){if(e===this&&(e=void 0),n)for(o=0,s=n.length;o\u003Cs;o++){var a=n[o];if(a.ctx===e&&a.fn===i)return a.fn=r,this._firingCount&&(this._events[t]=n=n.slice()),void n.splice(o,1)}}else{for(o=0,s=n.length;o\u003Cs;o++)n[o].fn=r;delete this._events[t]}},fire:function(t,e,n){if(!this.listens(t,n))return this;var o=i({},e,{type:t,target:this,sourceTarget:e&&e.sourceTarget||this});if(this._events){var s=this._events[t];if(s){this._firingCount=this._firingCount+1||1;for(var r=0,a=s.length;r\u003Ca;r++){var h=s[r];h.fn.call(h.ctx||this,o)}this._firingCount--}}return n&&this._propagateEvent(o),this},listens:function(t,i){var e=this._events&&this._events[t];if(e&&e.length)return!0;if(i)for(var n in this._eventParents)if(this._eventParents[n].listens(t,i))return!0;return!1},once:function(t,i,n){if(\\\"object\\\"==typeof t){for(var o in t)this.once(o,t[o],i);return this}var s=e(function(){this.off(t,i,n).off(t,s,n)},this);return this.on(t,i,n).on(t,s,n)},addEventParent:function(t){return this._eventParents=this._eventParents||{},this._eventParents[n(t)]=t,this},removeEventParent:function(t){return this._eventParents&&delete this._eventParents[n(t)],this},_propagateEvent:function(t){for(var e in this._eventParents)this._eventParents[e].fire(t.type,i({layer:t.target,propagatedFrom:t.target},t),!0)}};hi.addEventListener=hi.on,hi.removeEventListener=hi.clearAllEventListeners=hi.off,hi.addOneTimeEventListener=hi.once,hi.fireEvent=hi.fire,hi.hasEventListeners=hi.listens;var ui=v.extend(hi),li=Math.trunc||function(t){return t>0?Math.floor(t):Math.ceil(t)};x.prototype={clone:function(){return new x(this.x,this.y)},add:function(t){return this.clone()._add(w(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(w(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},scaleBy:function(t){return new x(this.x*t.x,this.y*t.y)},unscaleBy:function(t){return new x(this.x/t.x,this.y/t.y)},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.clone()._ceil()},_ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},trunc:function(){return this.clone()._trunc()},_trunc:function(){return this.x=li(this.x),this.y=li(this.y),this},distanceTo:function(t){var i=(t=w(t)).x-this.x,e=t.y-this.y;return Math.sqrt(i*i+e*e)},equals:function(t){return(t=w(t)).x===this.x&&t.y===this.y},contains:function(t){return t=w(t),Math.abs(t.x)\u003C=Math.abs(this.x)&&Math.abs(t.y)\u003C=Math.abs(this.y)},toString:function(){return\\\"Point(\\\"+a(this.x)+\\\", \\\"+a(this.y)+\\\")\\\"}},P.prototype={extend:function(t){return t=w(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new x((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new x(this.min.x,this.max.y)},getTopRight:function(){return new x(this.max.x,this.min.y)},getTopLeft:function(){return this.min},getBottomRight:function(){return this.max},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var i,e;return(t=\\\"number\\\"==typeof t[0]||t instanceof x?w(t):b(t))instanceof P?(i=t.min,e=t.max):i=e=t,i.x>=this.min.x&&e.x\u003C=this.max.x&&i.y>=this.min.y&&e.y\u003C=this.max.y},intersects:function(t){t=b(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>=i.x&&n.x\u003C=e.x,r=o.y>=i.y&&n.y\u003C=e.y;return s&&r},overlaps:function(t){t=b(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>i.x&&n.x\u003Ce.x,r=o.y>i.y&&n.y\u003Ce.y;return s&&r},isValid:function(){return!(!this.min||!this.max)}},T.prototype={extend:function(t){var i,e,n=this._southWest,o=this._northEast;if(t instanceof M)i=t,e=t;else{if(!(t instanceof T))return t?this.extend(C(t)||z(t)):this;if(i=t._southWest,e=t._northEast,!i||!e)return this}return n||o?(n.lat=Math.min(i.lat,n.lat),n.lng=Math.min(i.lng,n.lng),o.lat=Math.max(e.lat,o.lat),o.lng=Math.max(e.lng,o.lng)):(this._southWest=new M(i.lat,i.lng),this._northEast=new M(e.lat,e.lng)),this},pad:function(t){var i=this._southWest,e=this._northEast,n=Math.abs(i.lat-e.lat)*t,o=Math.abs(i.lng-e.lng)*t;return new T(new M(i.lat-n,i.lng-o),new M(e.lat+n,e.lng+o))},getCenter:function(){return new M((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new M(this.getNorth(),this.getWest())},getSouthEast:function(){return new M(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t=\\\"number\\\"==typeof t[0]||t instanceof M||\\\"lat\\\"in t?C(t):z(t);var i,e,n=this._southWest,o=this._northEast;return t instanceof T?(i=t.getSouthWest(),e=t.getNorthEast()):i=e=t,i.lat>=n.lat&&e.lat\u003C=o.lat&&i.lng>=n.lng&&e.lng\u003C=o.lng},intersects:function(t){t=z(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>=i.lat&&n.lat\u003C=e.lat,r=o.lng>=i.lng&&n.lng\u003C=e.lng;return s&&r},overlaps:function(t){t=z(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>i.lat&&n.lat\u003Ce.lat,r=o.lng>i.lng&&n.lng\u003Ce.lng;return s&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(\\\",\\\")},equals:function(t,i){return!!t&&(t=z(t),this._southWest.equals(t.getSouthWest(),i)&&this._northEast.equals(t.getNorthEast(),i))},isValid:function(){return!(!this._southWest||!this._northEast)}},M.prototype={equals:function(t,i){return!!t&&(t=C(t),Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng))\u003C=(void 0===i?1e-9:i))},toString:function(t){return\\\"LatLng(\\\"+a(this.lat,t)+\\\", \\\"+a(this.lng,t)+\\\")\\\"},distanceTo:function(t){return _i.distance(this,C(t))},wrap:function(){return _i.wrapLatLng(this)},toBounds:function(t){var i=180*t/40075017,e=i/Math.cos(Math.PI/180*this.lat);return z([this.lat-i,this.lng-e],[this.lat+i,this.lng+e])},clone:function(){return new M(this.lat,this.lng,this.alt)}};var ci={latLngToPoint:function(t,i){var e=this.projection.project(t),n=this.scale(i);return this.transformation._transform(e,n)},pointToLatLng:function(t,i){var e=this.scale(i),n=this.transformation.untransform(t,e);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},unproject:function(t){return this.projection.unproject(t)},scale:function(t){return 256*Math.pow(2,t)},zoom:function(t){return Math.log(t/256)/Math.LN2},getProjectedBounds:function(t){if(this.infinite)return null;var i=this.projection.bounds,e=this.scale(t);return new P(this.transformation.transform(i.min,e),this.transformation.transform(i.max,e))},infinite:!1,wrapLatLng:function(t){var i=this.wrapLng?s(t.lng,this.wrapLng,!0):t.lng;return new M(this.wrapLat?s(t.lat,this.wrapLat,!0):t.lat,i,t.alt)},wrapLatLngBounds:function(t){var i=t.getCenter(),e=this.wrapLatLng(i),n=i.lat-e.lat,o=i.lng-e.lng;if(0===n&&0===o)return t;var s=t.getSouthWest(),r=t.getNorthEast();return new T(new M(s.lat-n,s.lng-o),new M(r.lat-n,r.lng-o))}},_i=i({},ci,{wrapLng:[-180,180],R:6371e3,distance:function(t,i){var e=Math.PI/180,n=t.lat*e,o=i.lat*e,s=Math.sin((i.lat-t.lat)*e/2),r=Math.sin((i.lng-t.lng)*e/2),a=s*s+Math.cos(n)*Math.cos(o)*r*r,h=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));return this.R*h}}),di={R:6378137,MAX_LATITUDE:85.0511287798,project:function(t){var i=Math.PI/180,e=this.MAX_LATITUDE,n=Math.max(Math.min(e,t.lat),-e),o=Math.sin(n*i);return new x(this.R*t.lng*i,this.R*Math.log((1+o)/(1-o))/2)},unproject:function(t){var i=180/Math.PI;return new M((2*Math.atan(Math.exp(t.y/this.R))-Math.PI/2)*i,t.x*i/this.R)},bounds:function(){var t=6378137*Math.PI;return new P([-t,-t],[t,t])}()};Z.prototype={transform:function(t,i){return this._transform(t.clone(),i)},_transform:function(t,i){return i=i||1,t.x=i*(this._a*t.x+this._b),t.y=i*(this._c*t.y+this._d),t},untransform:function(t,i){return i=i||1,new x((t.x/i-this._b)/this._a,(t.y/i-this._d)/this._c)}};var pi,mi,fi,gi,vi=i({},_i,{code:\\\"EPSG:3857\\\",projection:di,transformation:function(){var t=.5/(Math.PI*di.R);return S(t,.5,-t,.5)}()}),yi=i({},vi,{code:\\\"EPSG:900913\\\"}),xi=document.documentElement.style,wi=\\\"ActiveXObject\\\"in window,Li=wi&&!document.addEventListener,Pi=\\\"msLaunchUri\\\"in navigator&&!(\\\"documentMode\\\"in document),bi=I(\\\"webkit\\\"),Ti=I(\\\"android\\\"),zi=I(\\\"android 2\\\")||I(\\\"android 3\\\"),Mi=parseInt(/WebKit\\\\/([0-9]+)|$/.exec(navigator.userAgent)[1],10),Ci=Ti&&I(\\\"Google\\\")&&Mi\u003C537&&!(\\\"AudioNode\\\"in window),Zi=!!window.opera,Si=I(\\\"chrome\\\"),Ei=I(\\\"gecko\\\")&&!bi&&!Zi&&!wi,ki=!Si&&I(\\\"safari\\\"),Ii=I(\\\"phantom\\\"),Ai=\\\"OTransition\\\"in xi,Bi=0===navigator.platform.indexOf(\\\"Win\\\"),Oi=wi&&\\\"transition\\\"in xi,Ri=\\\"WebKitCSSMatrix\\\"in window&&\\\"m11\\\"in new window.WebKitCSSMatrix&&!zi,Di=\\\"MozPerspective\\\"in xi,Ni=!window.L_DISABLE_3D&&(Oi||Ri||Di)&&!Ai&&!Ii,ji=\\\"undefined\\\"!=typeof orientation||I(\\\"mobile\\\"),Wi=ji&&bi,Hi=ji&&Ri,Fi=!window.PointerEvent&&window.MSPointerEvent,Ui=!(!window.PointerEvent&&!Fi),Vi=!window.L_NO_TOUCH&&(Ui||\\\"ontouchstart\\\"in window||window.DocumentTouch&&document instanceof window.DocumentTouch),qi=ji&&Zi,Gi=ji&&Ei,Ki=(window.devicePixelRatio||window.screen.deviceXDPI/window.screen.logicalXDPI)>1,Yi=!!document.createElement(\\\"canvas\\\").getContext,Xi=!(!document.createElementNS||!E(\\\"svg\\\").createSVGRect),Ji=!Xi&&function(){try{var t=document.createElement(\\\"div\\\");t.innerHTML='\u003Cv:shape adj=\\\"1\\\"/>';var i=t.firstChild;return i.style.behavior=\\\"url(#default#VML)\\\",i&&\\\"object\\\"==typeof i.adj}catch(t){return!1}}(),$i=(Object.freeze||Object)({ie:wi,ielt9:Li,edge:Pi,webkit:bi,android:Ti,android23:zi,androidStock:Ci,opera:Zi,chrome:Si,gecko:Ei,safari:ki,phantom:Ii,opera12:Ai,win:Bi,ie3d:Oi,webkit3d:Ri,gecko3d:Di,any3d:Ni,mobile:ji,mobileWebkit:Wi,mobileWebkit3d:Hi,msPointer:Fi,pointer:Ui,touch:Vi,mobileOpera:qi,mobileGecko:Gi,retina:Ki,canvas:Yi,svg:Xi,vml:Ji}),Qi=Fi?\\\"MSPointerDown\\\":\\\"pointerdown\\\",te=Fi?\\\"MSPointerMove\\\":\\\"pointermove\\\",ie=Fi?\\\"MSPointerUp\\\":\\\"pointerup\\\",ee=Fi?\\\"MSPointerCancel\\\":\\\"pointercancel\\\",ne=[\\\"INPUT\\\",\\\"SELECT\\\",\\\"OPTION\\\"],oe={},se=!1,re=0,ae=Fi?\\\"MSPointerDown\\\":Ui?\\\"pointerdown\\\":\\\"touchstart\\\",he=Fi?\\\"MSPointerUp\\\":Ui?\\\"pointerup\\\":\\\"touchend\\\",ue=\\\"_leaflet_\\\",le=\\\"_leaflet_events\\\",ce=Bi&&Si?2*window.devicePixelRatio:Ei?window.devicePixelRatio:1,_e={},de=(Object.freeze||Object)({on:V,off:q,stopPropagation:Y,disableScrollPropagation:X,disableClickPropagation:J,preventDefault:$,stop:Q,getMousePosition:tt,getWheelDelta:it,fakeStop:et,skipped:nt,isExternalTarget:ot,addListener:V,removeListener:q}),pe=xt([\\\"transform\\\",\\\"WebkitTransform\\\",\\\"OTransform\\\",\\\"MozTransform\\\",\\\"msTransform\\\"]),me=xt([\\\"webkitTransition\\\",\\\"transition\\\",\\\"OTransition\\\",\\\"MozTransition\\\",\\\"msTransition\\\"]),fe=\\\"webkitTransition\\\"===me||\\\"OTransition\\\"===me?me+\\\"End\\\":\\\"transitionend\\\";if(\\\"onselectstart\\\"in document)mi=function(){V(window,\\\"selectstart\\\",$)},fi=function(){q(window,\\\"selectstart\\\",$)};else{var ge=xt([\\\"userSelect\\\",\\\"WebkitUserSelect\\\",\\\"OUserSelect\\\",\\\"MozUserSelect\\\",\\\"msUserSelect\\\"]);mi=function(){if(ge){var t=document.documentElement.style;gi=t[ge],t[ge]=\\\"none\\\"}},fi=function(){ge&&(document.documentElement.style[ge]=gi,gi=void 0)}}var ve,ye,xe=(Object.freeze||Object)({TRANSFORM:pe,TRANSITION:me,TRANSITION_END:fe,get:rt,getStyle:at,create:ht,remove:ut,empty:lt,toFront:ct,toBack:_t,hasClass:dt,addClass:pt,removeClass:mt,setClass:ft,getClass:gt,setOpacity:vt,testProp:xt,setTransform:wt,setPosition:Lt,getPosition:Pt,disableTextSelection:mi,enableTextSelection:fi,disableImageDrag:bt,enableImageDrag:Tt,preventOutline:zt,restoreOutline:Mt}),we=ui.extend({run:function(t,i,e,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=e||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=Pt(t),this._offset=i.subtract(this._startPos),this._startTime=+new Date,this.fire(\\\"start\\\"),this._animate()},stop:function(){this._inProgress&&(this._step(!0),this._complete())},_animate:function(){this._animId=f(this._animate,this),this._step()},_step:function(t){var i=+new Date-this._startTime,e=1e3*this._duration;i\u003Ce?this._runFrame(this._easeOut(i/e),t):(this._runFrame(1),this._complete())},_runFrame:function(t,i){var e=this._startPos.add(this._offset.multiplyBy(t));i&&e._round(),Lt(this._el,e),this.fire(\\\"step\\\")},_complete:function(){g(this._animId),this._inProgress=!1,this.fire(\\\"end\\\")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),Le=ui.extend({options:{crs:vi,center:void 0,zoom:void 0,minZoom:void 0,maxZoom:void 0,layers:[],maxBounds:void 0,renderer:void 0,zoomAnimation:!0,zoomAnimationThreshold:4,fadeAnimation:!0,markerZoomAnimation:!0,transform3DLimit:8388608,zoomSnap:1,zoomDelta:1,trackResize:!0},initialize:function(t,i){i=l(this,i),this._initContainer(t),this._initLayout(),this._onResize=e(this._onResize,this),this._initEvents(),i.maxBounds&&this.setMaxBounds(i.maxBounds),void 0!==i.zoom&&(this._zoom=this._limitZoom(i.zoom)),i.center&&void 0!==i.zoom&&this.setView(C(i.center),i.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._sizeChanged=!0,this.callInitHooks(),this._zoomAnimated=me&&Ni&&!qi&&this.options.zoomAnimation,this._zoomAnimated&&(this._createAnimProxy(),V(this._proxy,fe,this._catchTransitionEnd,this)),this._addLayers(this.options.layers)},setView:function(t,e,n){return e=void 0===e?this._zoom:this._limitZoom(e),t=this._limitCenter(C(t),e,this.options.maxBounds),n=n||{},this._stop(),this._loaded&&!n.reset&&!0!==n&&(void 0!==n.animate&&(n.zoom=i({animate:n.animate},n.zoom),n.pan=i({animate:n.animate,duration:n.duration},n.pan)),this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan))?(clearTimeout(this._sizeTimer),this):(this._resetView(t,e),this)},setZoom:function(t,i){return this._loaded?this.setView(this.getCenter(),t,{zoom:i}):(this._zoom=t,this)},zoomIn:function(t,i){return t=t||(Ni?this.options.zoomDelta:1),this.setZoom(this._zoom+t,i)},zoomOut:function(t,i){return t=t||(Ni?this.options.zoomDelta:1),this.setZoom(this._zoom-t,i)},setZoomAround:function(t,i,e){var n=this.getZoomScale(i),o=this.getSize().divideBy(2),s=(t instanceof x?t:this.latLngToContainerPoint(t)).subtract(o).multiplyBy(1-1/n),r=this.containerPointToLatLng(o.add(s));return this.setView(r,i,{zoom:e})},_getBoundsCenterZoom:function(t,i){i=i||{},t=t.getBounds?t.getBounds():z(t);var e=w(i.paddingTopLeft||i.padding||[0,0]),n=w(i.paddingBottomRight||i.padding||[0,0]),o=this.getBoundsZoom(t,!1,e.add(n));if((o=\\\"number\\\"==typeof i.maxZoom?Math.min(i.maxZoom,o):o)===1/0)return{center:t.getCenter(),zoom:o};var s=n.subtract(e).divideBy(2),r=this.project(t.getSouthWest(),o),a=this.project(t.getNorthEast(),o);return{center:this.unproject(r.add(a).divideBy(2).add(s),o),zoom:o}},fitBounds:function(t,i){if(!(t=z(t)).isValid())throw new Error(\\\"Bounds are not valid.\\\");var e=this._getBoundsCenterZoom(t,i);return this.setView(e.center,e.zoom,i)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,i){return this.setView(t,this._zoom,{pan:i})},panBy:function(t,i){if(t=w(t).round(),i=i||{},!t.x&&!t.y)return this.fire(\\\"moveend\\\");if(!0!==i.animate&&!this.getSize().contains(t))return this._resetView(this.unproject(this.project(this.getCenter()).add(t)),this.getZoom()),this;if(this._panAnim||(this._panAnim=new we,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),i.noMoveStart||this.fire(\\\"movestart\\\"),!1!==i.animate){pt(this._mapPane,\\\"leaflet-pan-anim\\\");var e=this._getMapPanePos().subtract(t).round();this._panAnim.run(this._mapPane,e,i.duration||.25,i.easeLinearity)}else this._rawPanBy(t),this.fire(\\\"move\\\").fire(\\\"moveend\\\");return this},flyTo:function(t,i,e){function n(t){var i=(g*g-m*m+(t?-1:1)*x*x*v*v)/(2*(t?g:m)*x*v),e=Math.sqrt(i*i+1)-i;return e\u003C1e-9?-18:Math.log(e)}function o(t){return(Math.exp(t)-Math.exp(-t))/2}function s(t){return(Math.exp(t)+Math.exp(-t))/2}function r(t){return o(t)/s(t)}function a(t){return m*(s(w)/s(w+y*t))}function h(t){return m*(s(w)*r(w+y*t)-o(w))/x}function u(t){return 1-Math.pow(1-t,1.5)}function l(){var e=(Date.now()-L)/b,n=u(e)*P;e\u003C=1?(this._flyToFrame=f(l,this),this._move(this.unproject(c.add(_.subtract(c).multiplyBy(h(n)/v)),p),this.getScaleZoom(m/a(n),p),{flyTo:!0})):this._move(t,i)._moveEnd(!0)}if(!1===(e=e||{}).animate||!Ni)return this.setView(t,i,e);this._stop();var c=this.project(this.getCenter()),_=this.project(t),d=this.getSize(),p=this._zoom;t=C(t),i=void 0===i?p:i;var m=Math.max(d.x,d.y),g=m*this.getZoomScale(p,i),v=_.distanceTo(c)||1,y=1.42,x=y*y,w=n(0),L=Date.now(),P=(n(1)-w)/y,b=e.duration?1e3*e.duration:1e3*P*.8;return this._moveStart(!0,e.noMoveStart),l.call(this),this},flyToBounds:function(t,i){var e=this._getBoundsCenterZoom(t,i);return this.flyTo(e.center,e.zoom,i)},setMaxBounds:function(t){return(t=z(t)).isValid()?(this.options.maxBounds&&this.off(\\\"moveend\\\",this._panInsideMaxBounds),this.options.maxBounds=t,this._loaded&&this._panInsideMaxBounds(),this.on(\\\"moveend\\\",this._panInsideMaxBounds)):(this.options.maxBounds=null,this.off(\\\"moveend\\\",this._panInsideMaxBounds))},setMinZoom:function(t){var i=this.options.minZoom;return this.options.minZoom=t,this._loaded&&i!==t&&(this.fire(\\\"zoomlevelschange\\\"),this.getZoom()\u003Cthis.options.minZoom)?this.setZoom(t):this},setMaxZoom:function(t){var i=this.options.maxZoom;return this.options.maxZoom=t,this._loaded&&i!==t&&(this.fire(\\\"zoomlevelschange\\\"),this.getZoom()>this.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,i){this._enforcingBounds=!0;var e=this.getCenter(),n=this._limitCenter(e,this._zoom,z(t));return e.equals(n)||this.panTo(n,i),this._enforcingBounds=!1,this},invalidateSize:function(t){if(!this._loaded)return this;t=i({animate:!1,pan:!0},!0===t?{animate:!0}:t);var n=this.getSize();this._sizeChanged=!0,this._lastCenter=null;var o=this.getSize(),s=n.divideBy(2).round(),r=o.divideBy(2).round(),a=s.subtract(r);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire(\\\"move\\\"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(e(this.fire,this,\\\"moveend\\\"),200)):this.fire(\\\"moveend\\\")),this.fire(\\\"resize\\\",{oldSize:n,newSize:o})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire(\\\"viewreset\\\"),this._stop()},locate:function(t){if(t=this._locateOptions=i({timeout:1e4,watch:!1},t),!(\\\"geolocation\\\"in navigator))return this._handleGeolocationError({code:0,message:\\\"Geolocation not supported.\\\"}),this;var n=e(this._handleGeolocationResponse,this),o=e(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(n,o,t):navigator.geolocation.getCurrentPosition(n,o,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var i=t.code,e=t.message||(1===i?\\\"permission denied\\\":2===i?\\\"position unavailable\\\":\\\"timeout\\\");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire(\\\"locationerror\\\",{code:i,message:\\\"Geolocation error: \\\"+e+\\\".\\\"})},_handleGeolocationResponse:function(t){var i=new M(t.coords.latitude,t.coords.longitude),e=i.toBounds(t.coords.accuracy),n=this._locateOptions;if(n.setView){var o=this.getBoundsZoom(e);this.setView(i,n.maxZoom?Math.min(o,n.maxZoom):o)}var s={latlng:i,bounds:e,timestamp:t.timestamp};for(var r in t.coords)\\\"number\\\"==typeof t.coords[r]&&(s[r]=t.coords[r]);this.fire(\\\"locationfound\\\",s)},addHandler:function(t,i){if(!i)return this;var e=this[t]=new i(this);return this._handlers.push(e),this.options[t]&&e.enable(),this},remove:function(){if(this._initEvents(!0),this._containerId!==this._container._leaflet_id)throw new Error(\\\"Map container is being reused by another instance\\\");try{delete this._container._leaflet_id,delete this._containerId}catch(t){this._container._leaflet_id=void 0,this._containerId=void 0}void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),ut(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this._loaded&&this.fire(\\\"unload\\\");var t;for(t in this._layers)this._layers[t].remove();for(t in this._panes)ut(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,i){var e=ht(\\\"div\\\",\\\"leaflet-pane\\\"+(t?\\\" leaflet-\\\"+t.replace(\\\"Pane\\\",\\\"\\\")+\\\"-pane\\\":\\\"\\\"),i||this._mapPane);return t&&(this._panes[t]=e),e},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new T(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,i,e){t=z(t),e=w(e||[0,0]);var n=this.getZoom()||0,o=this.getMinZoom(),s=this.getMaxZoom(),r=t.getNorthWest(),a=t.getSouthEast(),h=this.getSize().subtract(e),u=b(this.project(a,n),this.project(r,n)).getSize(),l=Ni?this.options.zoomSnap:1,c=h.x/u.x,_=h.y/u.y,d=i?Math.max(c,_):Math.min(c,_);return n=this.getScaleZoom(d,n),l&&(n=Math.round(n/(l/100))*(l/100),n=i?Math.ceil(n/l)*l:Math.floor(n/l)*l),Math.max(o,Math.min(s,n))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new x(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,i){var e=this._getTopLeftPoint(t,i);return new P(e,e.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return\\\"string\\\"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,i){var e=this.options.crs;return i=void 0===i?this._zoom:i,e.scale(t)/e.scale(i)},getScaleZoom:function(t,i){var e=this.options.crs;i=void 0===i?this._zoom:i;var n=e.zoom(t*e.scale(i));return isNaN(n)?1/0:n},project:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.latLngToPoint(C(t),i)},unproject:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.pointToLatLng(w(t),i)},layerPointToLatLng:function(t){var i=w(t).add(this.getPixelOrigin());return this.unproject(i)},latLngToLayerPoint:function(t){return this.project(C(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(C(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(z(t))},distance:function(t,i){return this.options.crs.distance(C(t),C(i))},containerPointToLayerPoint:function(t){return w(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return w(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var i=this.containerPointToLayerPoint(w(t));return this.layerPointToLatLng(i)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(C(t)))},mouseEventToContainerPoint:function(t){return tt(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var i=this._container=rt(t);if(!i)throw new Error(\\\"Map container not found.\\\");if(i._leaflet_id)throw new Error(\\\"Map container is already initialized.\\\");V(i,\\\"scroll\\\",this._onScroll,this),this._containerId=n(i)},_initLayout:function(){var t=this._container;this._fadeAnimated=this.options.fadeAnimation&&Ni,pt(t,\\\"leaflet-container\\\"+(Vi?\\\" leaflet-touch\\\":\\\"\\\")+(Ki?\\\" leaflet-retina\\\":\\\"\\\")+(Li?\\\" leaflet-oldie\\\":\\\"\\\")+(ki?\\\" leaflet-safari\\\":\\\"\\\")+(this._fadeAnimated?\\\" leaflet-fade-anim\\\":\\\"\\\"));var i=at(t,\\\"position\\\");\\\"absolute\\\"!==i&&\\\"relative\\\"!==i&&\\\"fixed\\\"!==i&&(t.style.position=\\\"relative\\\"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane(\\\"mapPane\\\",this._container),Lt(this._mapPane,new x(0,0)),this.createPane(\\\"tilePane\\\"),this.createPane(\\\"shadowPane\\\"),this.createPane(\\\"overlayPane\\\"),this.createPane(\\\"markerPane\\\"),this.createPane(\\\"tooltipPane\\\"),this.createPane(\\\"popupPane\\\"),this.options.markerZoomAnimation||(pt(t.markerPane,\\\"leaflet-zoom-hide\\\"),pt(t.shadowPane,\\\"leaflet-zoom-hide\\\"))},_resetView:function(t,i){Lt(this._mapPane,new x(0,0));var e=!this._loaded;this._loaded=!0,i=this._limitZoom(i),this.fire(\\\"viewprereset\\\");var n=this._zoom!==i;this._moveStart(n,!1)._move(t,i)._moveEnd(n),this.fire(\\\"viewreset\\\"),e&&this.fire(\\\"load\\\")},_moveStart:function(t,i){return t&&this.fire(\\\"zoomstart\\\"),i||this.fire(\\\"movestart\\\"),this},_move:function(t,i,e){void 0===i&&(i=this._zoom);var n=this._zoom!==i;return this._zoom=i,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),(n||e&&e.pinch)&&this.fire(\\\"zoom\\\",e),this.fire(\\\"move\\\",e)},_moveEnd:function(t){return t&&this.fire(\\\"zoomend\\\"),this.fire(\\\"moveend\\\")},_stop:function(){return g(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){Lt(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error(\\\"Set map center and zoom first.\\\")},_initEvents:function(t){this._targets={},this._targets[n(this._container)]=this;var i=t?q:V;i(this._container,\\\"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress\\\",this._handleDOMEvent,this),this.options.trackResize&&i(window,\\\"resize\\\",this._onResize,this),Ni&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,\\\"moveend\\\",this._onMoveEnd)},_onResize:function(){g(this._resizeRequest),this._resizeRequest=f(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,i){for(var e,o=[],s=\\\"mouseout\\\"===i||\\\"mouseover\\\"===i,r=t.target||t.srcElement,a=!1;r;){if((e=this._targets[n(r)])&&(\\\"click\\\"===i||\\\"preclick\\\"===i)&&!t._simulated&&this._draggableMoved(e)){a=!0;break}if(e&&e.listens(i,!0)){if(s&&!ot(r,t))break;if(o.push(e),s)break}if(r===this._container)break;r=r.parentNode}return o.length||a||s||!ot(r,t)||(o=[this]),o},_handleDOMEvent:function(t){if(this._loaded&&!nt(t)){var i=t.type;\\\"mousedown\\\"!==i&&\\\"keypress\\\"!==i||zt(t.target||t.srcElement),this._fireDOMEvent(t,i)}},_mouseEvents:[\\\"click\\\",\\\"dblclick\\\",\\\"mouseover\\\",\\\"mouseout\\\",\\\"contextmenu\\\"],_fireDOMEvent:function(t,e,n){if(\\\"click\\\"===t.type){var o=i({},t);o.type=\\\"preclick\\\",this._fireDOMEvent(o,o.type,n)}if(!t._stopped&&(n=(n||[]).concat(this._findEventTargets(t,e))).length){var s=n[0];\\\"contextmenu\\\"===e&&s.listens(e,!0)&&$(t);var r={originalEvent:t};if(\\\"keypress\\\"!==t.type){var a=s.getLatLng&&(!s._radius||s._radius\u003C=10);r.containerPoint=a?this.latLngToContainerPoint(s.getLatLng()):this.mouseEventToContainerPoint(t),r.layerPoint=this.containerPointToLayerPoint(r.containerPoint),r.latlng=a?s.getLatLng():this.layerPointToLatLng(r.layerPoint)}for(var h=0;h\u003Cn.length;h++)if(n[h].fire(e,r,!0),r.originalEvent._stopped||!1===n[h].options.bubblingMouseEvents&&-1!==d(this._mouseEvents,e))return}},_draggableMoved:function(t){return(t=t.dragging&&t.dragging.enabled()?t:this).dragging&&t.dragging.moved()||this.boxZoom&&this.boxZoom.moved()},_clearHandlers:function(){for(var t=0,i=this._handlers.length;t\u003Ci;t++)this._handlers[t].disable()},whenReady:function(t,i){return this._loaded?t.call(i||this,{target:this}):this.on(\\\"load\\\",t,i),this},_getMapPanePos:function(){return Pt(this._mapPane)||new x(0,0)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(t,i){return(t&&void 0!==i?this._getNewPixelOrigin(t,i):this.getPixelOrigin()).subtract(this._getMapPanePos())},_getNewPixelOrigin:function(t,i){var e=this.getSize()._divideBy(2);return this.project(t,i)._subtract(e)._add(this._getMapPanePos())._round()},_latLngToNewLayerPoint:function(t,i,e){var n=this._getNewPixelOrigin(e,i);return this.project(t,i)._subtract(n)},_latLngBoundsToNewLayerBounds:function(t,i,e){var n=this._getNewPixelOrigin(e,i);return b([this.project(t.getSouthWest(),i)._subtract(n),this.project(t.getNorthWest(),i)._subtract(n),this.project(t.getSouthEast(),i)._subtract(n),this.project(t.getNorthEast(),i)._subtract(n)])},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,i,e){if(!e)return t;var n=this.project(t,i),o=this.getSize().divideBy(2),s=new P(n.subtract(o),n.add(o)),r=this._getBoundsOffset(s,e,i);return r.round().equals([0,0])?t:this.unproject(n.add(r),i)},_limitOffset:function(t,i){if(!i)return t;var e=this.getPixelBounds(),n=new P(e.min.add(t),e.max.add(t));return t.add(this._getBoundsOffset(n,i))},_getBoundsOffset:function(t,i,e){var n=b(this.project(i.getNorthEast(),e),this.project(i.getSouthWest(),e)),o=n.min.subtract(t.min),s=n.max.subtract(t.max);return new x(this._rebound(o.x,-s.x),this._rebound(o.y,-s.y))},_rebound:function(t,i){return t+i>0?Math.round(t-i)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(i))},_limitZoom:function(t){var i=this.getMinZoom(),e=this.getMaxZoom(),n=Ni?this.options.zoomSnap:1;return n&&(t=Math.round(t/n)*n),Math.max(i,Math.min(e,t))},_onPanTransitionStep:function(){this.fire(\\\"move\\\")},_onPanTransitionEnd:function(){mt(this._mapPane,\\\"leaflet-pan-anim\\\"),this.fire(\\\"moveend\\\")},_tryAnimatedPan:function(t,i){var e=this._getCenterOffset(t)._trunc();return!(!0!==(i&&i.animate)&&!this.getSize().contains(e))&&(this.panBy(e,i),!0)},_createAnimProxy:function(){var t=this._proxy=ht(\\\"div\\\",\\\"leaflet-proxy leaflet-zoom-animated\\\");this._panes.mapPane.appendChild(t),this.on(\\\"zoomanim\\\",function(t){var i=pe,e=this._proxy.style[i];wt(this._proxy,this.project(t.center,t.zoom),this.getZoomScale(t.zoom,1)),e===this._proxy.style[i]&&this._animatingZoom&&this._onZoomTransitionEnd()},this),this.on(\\\"load moveend\\\",function(){var t=this.getCenter(),i=this.getZoom();wt(this._proxy,this.project(t,i),this.getZoomScale(i,1))},this),this._on(\\\"unload\\\",this._destroyAnimProxy,this)},_destroyAnimProxy:function(){ut(this._proxy),delete this._proxy},_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf(\\\"transform\\\")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName(\\\"leaflet-zoom-animated\\\").length},_tryAnimatedZoom:function(t,i,e){if(this._animatingZoom)return!0;if(e=e||{},!this._zoomAnimated||!1===e.animate||this._nothingToAnimate()||Math.abs(i-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(i),o=this._getCenterOffset(t)._divideBy(1-1/n);return!(!0!==e.animate&&!this.getSize().contains(o))&&(f(function(){this._moveStart(!0,!1)._animateZoom(t,i,!0)},this),!0)},_animateZoom:function(t,i,n,o){this._mapPane&&(n&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=i,pt(this._mapPane,\\\"leaflet-zoom-anim\\\")),this.fire(\\\"zoomanim\\\",{center:t,zoom:i,noUpdate:o}),setTimeout(e(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&mt(this._mapPane,\\\"leaflet-zoom-anim\\\"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom),f(function(){this._moveEnd(!0)},this))}}),Pe=v.extend({options:{position:\\\"topright\\\"},initialize:function(t){l(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var i=this._map;return i&&i.removeControl(this),this.options.position=t,i&&i.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var i=this._container=this.onAdd(t),e=this.getPosition(),n=t._controlCorners[e];return pt(i,\\\"leaflet-control\\\"),-1!==e.indexOf(\\\"bottom\\\")?n.insertBefore(i,n.firstChild):n.appendChild(i),this},remove:function(){return this._map?(ut(this._container),this.onRemove&&this.onRemove(this._map),this._map=null,this):this},_refocusOnMap:function(t){this._map&&t&&t.screenX>0&&t.screenY>0&&this._map.getContainer().focus()}}),be=function(t){return new Pe(t)};Le.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.remove(),this},_initControlPos:function(){function t(t,o){var s=e+t+\\\" \\\"+e+o;i[t+o]=ht(\\\"div\\\",s,n)}var i=this._controlCorners={},e=\\\"leaflet-\\\",n=this._controlContainer=ht(\\\"div\\\",e+\\\"control-container\\\",this._container);t(\\\"top\\\",\\\"left\\\"),t(\\\"top\\\",\\\"right\\\"),t(\\\"bottom\\\",\\\"left\\\"),t(\\\"bottom\\\",\\\"right\\\")},_clearControlPos:function(){for(var t in this._controlCorners)ut(this._controlCorners[t]);ut(this._controlContainer),delete this._controlCorners,delete this._controlContainer}});var Te=Pe.extend({options:{collapsed:!0,position:\\\"topright\\\",autoZIndex:!0,hideSingleBase:!1,sortLayers:!1,sortFunction:function(t,i,e,n){return e\u003Cn?-1:n\u003Ce?1:0}},initialize:function(t,i,e){l(this,e),this._layerControlInputs=[],this._layers=[],this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in i)this._addLayer(i[n],n,!0)},onAdd:function(t){this._initLayout(),this._update(),this._map=t,t.on(\\\"zoomend\\\",this._checkDisabledLayers,this);for(var i=0;i\u003Cthis._layers.length;i++)this._layers[i].layer.on(\\\"add remove\\\",this._onLayerChange,this);return this._container},addTo:function(t){return Pe.prototype.addTo.call(this,t),this._expandIfNotCollapsed()},onRemove:function(){this._map.off(\\\"zoomend\\\",this._checkDisabledLayers,this);for(var t=0;t\u003Cthis._layers.length;t++)this._layers[t].layer.off(\\\"add remove\\\",this._onLayerChange,this)},addBaseLayer:function(t,i){return this._addLayer(t,i),this._map?this._update():this},addOverlay:function(t,i){return this._addLayer(t,i,!0),this._map?this._update():this},removeLayer:function(t){t.off(\\\"add remove\\\",this._onLayerChange,this);var i=this._getLayer(n(t));return i&&this._layers.splice(this._layers.indexOf(i),1),this._map?this._update():this},expand:function(){pt(this._container,\\\"leaflet-control-layers-expanded\\\"),this._form.style.height=null;var t=this._map.getSize().y-(this._container.offsetTop+50);return t\u003Cthis._form.clientHeight?(pt(this._form,\\\"leaflet-control-layers-scrollbar\\\"),this._form.style.height=t+\\\"px\\\"):mt(this._form,\\\"leaflet-control-layers-scrollbar\\\"),this._checkDisabledLayers(),this},collapse:function(){return mt(this._container,\\\"leaflet-control-layers-expanded\\\"),this},_initLayout:function(){var t=\\\"leaflet-control-layers\\\",i=this._container=ht(\\\"div\\\",t),e=this.options.collapsed;i.setAttribute(\\\"aria-haspopup\\\",!0),J(i),X(i);var n=this._form=ht(\\\"form\\\",t+\\\"-list\\\");e&&(this._map.on(\\\"click\\\",this.collapse,this),Ti||V(i,{mouseenter:this.expand,mouseleave:this.collapse},this));var o=this._layersLink=ht(\\\"a\\\",t+\\\"-toggle\\\",i);o.href=\\\"#\\\",o.title=\\\"Layers\\\",Vi?(V(o,\\\"click\\\",Q),V(o,\\\"click\\\",this.expand,this)):V(o,\\\"focus\\\",this.expand,this),e||this.expand(),this._baseLayersList=ht(\\\"div\\\",t+\\\"-base\\\",n),this._separator=ht(\\\"div\\\",t+\\\"-separator\\\",n),this._overlaysList=ht(\\\"div\\\",t+\\\"-overlays\\\",n),i.appendChild(n)},_getLayer:function(t){for(var i=0;i\u003Cthis._layers.length;i++)if(this._layers[i]&&n(this._layers[i].layer)===t)return this._layers[i]},_addLayer:function(t,i,n){this._map&&t.on(\\\"add remove\\\",this._onLayerChange,this),this._layers.push({layer:t,name:i,overlay:n}),this.options.sortLayers&&this._layers.sort(e(function(t,i){return this.options.sortFunction(t.layer,i.layer,t.name,i.name)},this)),this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex)),this._expandIfNotCollapsed()},_update:function(){if(!this._container)return this;lt(this._baseLayersList),lt(this._overlaysList),this._layerControlInputs=[];var t,i,e,n,o=0;for(e=0;e\u003Cthis._layers.length;e++)n=this._layers[e],this._addItem(n),i=i||n.overlay,t=t||!n.overlay,o+=n.overlay?0:1;return this.options.hideSingleBase&&(t=t&&o>1,this._baseLayersList.style.display=t?\\\"\\\":\\\"none\\\"),this._separator.style.display=i&&t?\\\"\\\":\\\"none\\\",this},_onLayerChange:function(t){this._handlingClick||this._update();var i=this._getLayer(n(t.target)),e=i.overlay?\\\"add\\\"===t.type?\\\"overlayadd\\\":\\\"overlayremove\\\":\\\"add\\\"===t.type?\\\"baselayerchange\\\":null;e&&this._map.fire(e,i)},_createRadioElement:function(t,i){var e='\u003Cinput type=\\\"radio\\\" class=\\\"leaflet-control-layers-selector\\\" name=\\\"'+t+'\\\"'+(i?' checked=\\\"checked\\\"':\\\"\\\")+\\\"/>\\\",n=document.createElement(\\\"div\\\");return n.innerHTML=e,n.firstChild},_addItem:function(t){var i,e=document.createElement(\\\"label\\\"),o=this._map.hasLayer(t.layer);t.overlay?((i=document.createElement(\\\"input\\\")).type=\\\"checkbox\\\",i.className=\\\"leaflet-control-layers-selector\\\",i.defaultChecked=o):i=this._createRadioElement(\\\"leaflet-base-layers\\\",o),this._layerControlInputs.push(i),i.layerId=n(t.layer),V(i,\\\"click\\\",this._onInputClick,this);var s=document.createElement(\\\"span\\\");s.innerHTML=\\\" \\\"+t.name;var r=document.createElement(\\\"div\\\");return e.appendChild(r),r.appendChild(i),r.appendChild(s),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(e),this._checkDisabledLayers(),e},_onInputClick:function(){var t,i,e=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=e.length-1;s>=0;s--)t=e[s],i=this._getLayer(t.layerId).layer,t.checked?n.push(i):t.checked||o.push(i);for(s=0;s\u003Co.length;s++)this._map.hasLayer(o[s])&&this._map.removeLayer(o[s]);for(s=0;s\u003Cn.length;s++)this._map.hasLayer(n[s])||this._map.addLayer(n[s]);this._handlingClick=!1,this._refocusOnMap()},_checkDisabledLayers:function(){for(var t,i,e=this._layerControlInputs,n=this._map.getZoom(),o=e.length-1;o>=0;o--)t=e[o],i=this._getLayer(t.layerId).layer,t.disabled=void 0!==i.options.minZoom&&n\u003Ci.options.minZoom||void 0!==i.options.maxZoom&&n>i.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}}),ze=Pe.extend({options:{position:\\\"topleft\\\",zoomInText:\\\"+\\\",zoomInTitle:\\\"Zoom in\\\",zoomOutText:\\\"−\\\",zoomOutTitle:\\\"Zoom out\\\"},onAdd:function(t){var i=\\\"leaflet-control-zoom\\\",e=ht(\\\"div\\\",i+\\\" leaflet-bar\\\"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,i+\\\"-in\\\",e,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,i+\\\"-out\\\",e,this._zoomOut),this._updateDisabled(),t.on(\\\"zoomend zoomlevelschange\\\",this._updateDisabled,this),e},onRemove:function(t){t.off(\\\"zoomend zoomlevelschange\\\",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoom\u003Cthis._map.getMaxZoom()&&this._map.zoomIn(this._map.options.zoomDelta*(t.shiftKey?3:1))},_zoomOut:function(t){!this._disabled&&this._map._zoom>this._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,i,e,n,o){var s=ht(\\\"a\\\",e,n);return s.innerHTML=t,s.href=\\\"#\\\",s.title=i,s.setAttribute(\\\"role\\\",\\\"button\\\"),s.setAttribute(\\\"aria-label\\\",i),J(s),V(s,\\\"click\\\",Q),V(s,\\\"click\\\",o,this),V(s,\\\"click\\\",this._refocusOnMap,this),s},_updateDisabled:function(){var t=this._map,i=\\\"leaflet-disabled\\\";mt(this._zoomInButton,i),mt(this._zoomOutButton,i),(this._disabled||t._zoom===t.getMinZoom())&&pt(this._zoomOutButton,i),(this._disabled||t._zoom===t.getMaxZoom())&&pt(this._zoomInButton,i)}});Le.mergeOptions({zoomControl:!0}),Le.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new ze,this.addControl(this.zoomControl))});var Me=Pe.extend({options:{position:\\\"bottomleft\\\",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var i=ht(\\\"div\\\",\\\"leaflet-control-scale\\\"),e=this.options;return this._addScales(e,\\\"leaflet-control-scale-line\\\",i),t.on(e.updateWhenIdle?\\\"moveend\\\":\\\"move\\\",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?\\\"moveend\\\":\\\"move\\\",this._update,this)},_addScales:function(t,i,e){t.metric&&(this._mScale=ht(\\\"div\\\",i,e)),t.imperial&&(this._iScale=ht(\\\"div\\\",i,e))},_update:function(){var t=this._map,i=t.getSize().y/2,e=t.distance(t.containerPointToLatLng([0,i]),t.containerPointToLatLng([this.options.maxWidth,i]));this._updateScales(e)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var i=this._getRoundNum(t),e=i\u003C1e3?i+\\\" m\\\":i/1e3+\\\" km\\\";this._updateScale(this._mScale,e,i/t)},_updateImperial:function(t){var i,e,n,o=3.2808399*t;o>5280?(i=o/5280,e=this._getRoundNum(i),this._updateScale(this._iScale,e+\\\" mi\\\",e/i)):(n=this._getRoundNum(o),this._updateScale(this._iScale,n+\\\" ft\\\",n/o))},_updateScale:function(t,i,e){t.style.width=Math.round(this.options.maxWidth*e)+\\\"px\\\",t.innerHTML=i},_getRoundNum:function(t){var i=Math.pow(10,(Math.floor(t)+\\\"\\\").length-1),e=t/i;return e=e>=10?10:e>=5?5:e>=3?3:e>=2?2:1,i*e}}),Ce=Pe.extend({options:{position:\\\"bottomright\\\",prefix:'\u003Ca href=\\\"http://leafletjs.com\\\" title=\\\"A JS library for interactive maps\\\">Leaflet\u003C/a>'},initialize:function(t){l(this,t),this._attributions={}},onAdd:function(t){t.attributionControl=this,this._container=ht(\\\"div\\\",\\\"leaflet-control-attribution\\\"),J(this._container);for(var i in t._layers)t._layers[i].getAttribution&&this.addAttribution(t._layers[i].getAttribution());return this._update(),this._container},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):this},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):this},_update:function(){if(this._map){var t=[];for(var i in this._attributions)this._attributions[i]&&t.push(i);var e=[];this.options.prefix&&e.push(this.options.prefix),t.length&&e.push(t.join(\\\", \\\")),this._container.innerHTML=e.join(\\\" | \\\")}}});Le.mergeOptions({attributionControl:!0}),Le.addInitHook(function(){this.options.attributionControl&&(new Ce).addTo(this)});Pe.Layers=Te,Pe.Zoom=ze,Pe.Scale=Me,Pe.Attribution=Ce,be.layers=function(t,i,e){return new Te(t,i,e)},be.zoom=function(t){return new ze(t)},be.scale=function(t){return new Me(t)},be.attribution=function(t){return new Ce(t)};var Ze=v.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled?this:(this._enabled=!0,this.addHooks(),this)},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},enabled:function(){return!!this._enabled}});Ze.addTo=function(t,i){return t.addHandler(i,this),this};var Se,Ee={Events:hi},ke=Vi?\\\"touchstart mousedown\\\":\\\"mousedown\\\",Ie={mousedown:\\\"mouseup\\\",touchstart:\\\"touchend\\\",pointerdown:\\\"touchend\\\",MSPointerDown:\\\"touchend\\\"},Ae={mousedown:\\\"mousemove\\\",touchstart:\\\"touchmove\\\",pointerdown:\\\"touchmove\\\",MSPointerDown:\\\"touchmove\\\"},Be=ui.extend({options:{clickTolerance:3},initialize:function(t,i,e,n){l(this,n),this._element=t,this._dragStartTarget=i||t,this._preventOutline=e},enable:function(){this._enabled||(V(this._dragStartTarget,ke,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(Be._dragging===this&&this.finishDrag(),q(this._dragStartTarget,ke,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){if(!t._simulated&&this._enabled&&(this._moved=!1,!dt(this._element,\\\"leaflet-zoom-anim\\\")&&!(Be._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(Be._dragging=this,this._preventOutline&&zt(this._element),bt(),mi(),this._moving)))){this.fire(\\\"down\\\");var i=t.touches?t.touches[0]:t;this._startPoint=new x(i.clientX,i.clientY),V(document,Ae[t.type],this._onMove,this),V(document,Ie[t.type],this._onUp,this)}},_onMove:function(t){if(!t._simulated&&this._enabled)if(t.touches&&t.touches.length>1)this._moved=!0;else{var i=t.touches&&1===t.touches.length?t.touches[0]:t,e=new x(i.clientX,i.clientY).subtract(this._startPoint);(e.x||e.y)&&(Math.abs(e.x)+Math.abs(e.y)\u003Cthis.options.clickTolerance||($(t),this._moved||(this.fire(\\\"dragstart\\\"),this._moved=!0,this._startPos=Pt(this._element).subtract(e),pt(document.body,\\\"leaflet-dragging\\\"),this._lastTarget=t.target||t.srcElement,window.SVGElementInstance&&this._lastTarget instanceof SVGElementInstance&&(this._lastTarget=this._lastTarget.correspondingUseElement),pt(this._lastTarget,\\\"leaflet-drag-target\\\")),this._newPos=this._startPos.add(e),this._moving=!0,g(this._animRequest),this._lastEvent=t,this._animRequest=f(this._updatePosition,this,!0)))}},_updatePosition:function(){var t={originalEvent:this._lastEvent};this.fire(\\\"predrag\\\",t),Lt(this._element,this._newPos),this.fire(\\\"drag\\\",t)},_onUp:function(t){!t._simulated&&this._enabled&&this.finishDrag()},finishDrag:function(){mt(document.body,\\\"leaflet-dragging\\\"),this._lastTarget&&(mt(this._lastTarget,\\\"leaflet-drag-target\\\"),this._lastTarget=null);for(var t in Ae)q(document,Ae[t],this._onMove,this),q(document,Ie[t],this._onUp,this);Tt(),fi(),this._moved&&this._moving&&(g(this._animRequest),this.fire(\\\"dragend\\\",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1,Be._dragging=!1}}),Oe=(Object.freeze||Object)({simplify:Ct,pointToSegmentDistance:Zt,closestPointOnSegment:function(t,i,e){return Rt(t,i,e)},clipSegment:It,_getEdgeIntersection:At,_getBitCode:Bt,_sqClosestPointOnSegment:Rt,isFlat:Dt,_flat:Nt}),Re=(Object.freeze||Object)({clipPolygon:jt}),De={project:function(t){return new x(t.lng,t.lat)},unproject:function(t){return new M(t.y,t.x)},bounds:new P([-180,-90],[180,90])},Ne={R:6378137,R_MINOR:6356752.314245179,bounds:new P([-20037508.34279,-15496570.73972],[20037508.34279,18764656.23138]),project:function(t){var i=Math.PI/180,e=this.R,n=t.lat*i,o=this.R_MINOR/e,s=Math.sqrt(1-o*o),r=s*Math.sin(n),a=Math.tan(Math.PI/4-n/2)/Math.pow((1-r)/(1+r),s/2);return n=-e*Math.log(Math.max(a,1e-10)),new x(t.lng*i*e,n)},unproject:function(t){for(var i,e=180/Math.PI,n=this.R,o=this.R_MINOR/n,s=Math.sqrt(1-o*o),r=Math.exp(-t.y/n),a=Math.PI/2-2*Math.atan(r),h=0,u=.1;h\u003C15&&Math.abs(u)>1e-7;h++)i=s*Math.sin(a),i=Math.pow((1-i)/(1+i),s/2),a+=u=Math.PI/2-2*Math.atan(r*i)-a;return new M(a*e,t.x*e/n)}},je=(Object.freeze||Object)({LonLat:De,Mercator:Ne,SphericalMercator:di}),We=i({},_i,{code:\\\"EPSG:3395\\\",projection:Ne,transformation:function(){var t=.5/(Math.PI*Ne.R);return S(t,.5,-t,.5)}()}),He=i({},_i,{code:\\\"EPSG:4326\\\",projection:De,transformation:S(1/180,1,-1/180,.5)}),Fe=i({},ci,{projection:De,transformation:S(1,0,-1,0),scale:function(t){return Math.pow(2,t)},zoom:function(t){return Math.log(t)/Math.LN2},distance:function(t,i){var e=i.lng-t.lng,n=i.lat-t.lat;return Math.sqrt(e*e+n*n)},infinite:!0});ci.Earth=_i,ci.EPSG3395=We,ci.EPSG3857=vi,ci.EPSG900913=yi,ci.EPSG4326=He,ci.Simple=Fe;var Ue=ui.extend({options:{pane:\\\"overlayPane\\\",attribution:null,bubblingMouseEvents:!0},addTo:function(t){return t.addLayer(this),this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(t){return t&&t.removeLayer(this),this},getPane:function(t){return this._map.getPane(t?this.options[t]||t:this.options.pane)},addInteractiveTarget:function(t){return this._map._targets[n(t)]=this,this},removeInteractiveTarget:function(t){return delete this._map._targets[n(t)],this},getAttribution:function(){return this.options.attribution},_layerAdd:function(t){var i=t.target;if(i.hasLayer(this)){if(this._map=i,this._zoomAnimated=i._zoomAnimated,this.getEvents){var e=this.getEvents();i.on(e,this),this.once(\\\"remove\\\",function(){i.off(e,this)},this)}this.onAdd(i),this.getAttribution&&i.attributionControl&&i.attributionControl.addAttribution(this.getAttribution()),this.fire(\\\"add\\\"),i.fire(\\\"layeradd\\\",{layer:this})}}});Le.include({addLayer:function(t){if(!t._layerAdd)throw new Error(\\\"The provided object is not a Layer.\\\");var i=n(t);return this._layers[i]?this:(this._layers[i]=t,t._mapToAdd=this,t.beforeAdd&&t.beforeAdd(this),this.whenReady(t._layerAdd,t),this)},removeLayer:function(t){var i=n(t);return this._layers[i]?(this._loaded&&t.onRemove(this),t.getAttribution&&this.attributionControl&&this.attributionControl.removeAttribution(t.getAttribution()),delete this._layers[i],this._loaded&&(this.fire(\\\"layerremove\\\",{layer:t}),t.fire(\\\"remove\\\")),t._map=t._mapToAdd=null,this):this},hasLayer:function(t){return!!t&&n(t)in this._layers},eachLayer:function(t,i){for(var e in this._layers)t.call(i,this._layers[e]);return this},_addLayers:function(t){for(var i=0,e=(t=t?ei(t)?t:[t]:[]).length;i\u003Ce;i++)this.addLayer(t[i])},_addZoomLimit:function(t){!isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[n(t)]=t,this._updateZoomLevels())},_removeZoomLimit:function(t){var i=n(t);this._zoomBoundLayers[i]&&(delete this._zoomBoundLayers[i],this._updateZoomLevels())},_updateZoomLevels:function(){var t=1/0,i=-1/0,e=this._getZoomSpan();for(var n in this._zoomBoundLayers){var o=this._zoomBoundLayers[n].options;t=void 0===o.minZoom?t:Math.min(t,o.minZoom),i=void 0===o.maxZoom?i:Math.max(i,o.maxZoom)}this._layersMaxZoom=i===-1/0?void 0:i,this._layersMinZoom=t===1/0?void 0:t,e!==this._getZoomSpan()&&this.fire(\\\"zoomlevelschange\\\"),void 0===this.options.maxZoom&&this._layersMaxZoom&&this.getZoom()>this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()\u003Cthis._layersMinZoom&&this.setZoom(this._layersMinZoom)}});var Ve=Ue.extend({initialize:function(t,i){l(this,i),this._layers={};var e,n;if(t)for(e=0,n=t.length;e\u003Cn;e++)this.addLayer(t[e])},addLayer:function(t){var i=this.getLayerId(t);return this._layers[i]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var i=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[i]&&this._map.removeLayer(this._layers[i]),delete this._layers[i],this},hasLayer:function(t){return!!t&&(t in this._layers||this.getLayerId(t)in this._layers)},clearLayers:function(){return this.eachLayer(this.removeLayer,this)},invoke:function(t){var i,e,n=Array.prototype.slice.call(arguments,1);for(i in this._layers)(e=this._layers[i])[t]&&e[t].apply(e,n);return this},onAdd:function(t){this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t)},eachLayer:function(t,i){for(var e in this._layers)t.call(i,this._layers[e]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];return this.eachLayer(t.push,t),t},setZIndex:function(t){return this.invoke(\\\"setZIndex\\\",t)},getLayerId:function(t){return n(t)}}),qe=Ve.extend({addLayer:function(t){return this.hasLayer(t)?this:(t.addEventParent(this),Ve.prototype.addLayer.call(this,t),this.fire(\\\"layeradd\\\",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.removeEventParent(this),Ve.prototype.removeLayer.call(this,t),this.fire(\\\"layerremove\\\",{layer:t})):this},setStyle:function(t){return this.invoke(\\\"setStyle\\\",t)},bringToFront:function(){return this.invoke(\\\"bringToFront\\\")},bringToBack:function(){return this.invoke(\\\"bringToBack\\\")},getBounds:function(){var t=new T;for(var i in this._layers){var e=this._layers[i];t.extend(e.getBounds?e.getBounds():e.getLatLng())}return t}}),Ge=v.extend({options:{popupAnchor:[0,0],tooltipAnchor:[0,0]},initialize:function(t){l(this,t)},createIcon:function(t){return this._createIcon(\\\"icon\\\",t)},createShadow:function(t){return this._createIcon(\\\"shadow\\\",t)},_createIcon:function(t,i){var e=this._getIconUrl(t);if(!e){if(\\\"icon\\\"===t)throw new Error(\\\"iconUrl not set in Icon options (see the docs).\\\");return null}var n=this._createImg(e,i&&\\\"IMG\\\"===i.tagName?i:null);return this._setIconStyles(n,t),n},_setIconStyles:function(t,i){var e=this.options,n=e[i+\\\"Size\\\"];\\\"number\\\"==typeof n&&(n=[n,n]);var o=w(n),s=w(\\\"shadow\\\"===i&&e.shadowAnchor||e.iconAnchor||o&&o.divideBy(2,!0));t.className=\\\"leaflet-marker-\\\"+i+\\\" \\\"+(e.className||\\\"\\\"),s&&(t.style.marginLeft=-s.x+\\\"px\\\",t.style.marginTop=-s.y+\\\"px\\\"),o&&(t.style.width=o.x+\\\"px\\\",t.style.height=o.y+\\\"px\\\")},_createImg:function(t,i){return i=i||document.createElement(\\\"img\\\"),i.src=t,i},_getIconUrl:function(t){return Ki&&this.options[t+\\\"RetinaUrl\\\"]||this.options[t+\\\"Url\\\"]}}),Ke=Ge.extend({options:{iconUrl:\\\"marker-icon.png\\\",iconRetinaUrl:\\\"marker-icon-2x.png\\\",shadowUrl:\\\"marker-shadow.png\\\",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],tooltipAnchor:[16,-28],shadowSize:[41,41]},_getIconUrl:function(t){return Ke.imagePath||(Ke.imagePath=this._detectIconPath()),(this.options.imagePath||Ke.imagePath)+Ge.prototype._getIconUrl.call(this,t)},_detectIconPath:function(){var t=ht(\\\"div\\\",\\\"leaflet-default-icon-path\\\",document.body),i=at(t,\\\"background-image\\\")||at(t,\\\"backgroundImage\\\");return document.body.removeChild(t),i=null===i||0!==i.indexOf(\\\"url\\\")?\\\"\\\":i.replace(/^url\\\\([\\\"']?/,\\\"\\\").replace(/marker-icon\\\\.png[\\\"']?\\\\)$/,\\\"\\\")}}),Ye=Ze.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new Be(t,t,!0)),this._draggable.on({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).enable(),pt(t,\\\"leaflet-marker-draggable\\\")},removeHooks:function(){this._draggable.off({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).disable(),this._marker._icon&&mt(this._marker._icon,\\\"leaflet-marker-draggable\\\")},moved:function(){return this._draggable&&this._draggable._moved},_adjustPan:function(t){var i=this._marker,e=i._map,n=this._marker.options.autoPanSpeed,o=this._marker.options.autoPanPadding,s=L.DomUtil.getPosition(i._icon),r=e.getPixelBounds(),a=e.getPixelOrigin(),h=b(r.min._subtract(a).add(o),r.max._subtract(a).subtract(o));if(!h.contains(s)){var u=w((Math.max(h.max.x,s.x)-h.max.x)/(r.max.x-h.max.x)-(Math.min(h.min.x,s.x)-h.min.x)/(r.min.x-h.min.x),(Math.max(h.max.y,s.y)-h.max.y)/(r.max.y-h.max.y)-(Math.min(h.min.y,s.y)-h.min.y)/(r.min.y-h.min.y)).multiplyBy(n);e.panBy(u,{animate:!1}),this._draggable._newPos._add(u),this._draggable._startPos._add(u),L.DomUtil.setPosition(i._icon,this._draggable._newPos),this._onDrag(t),this._panRequest=f(this._adjustPan.bind(this,t))}},_onDragStart:function(){this._oldLatLng=this._marker.getLatLng(),this._marker.closePopup().fire(\\\"movestart\\\").fire(\\\"dragstart\\\")},_onPreDrag:function(t){this._marker.options.autoPan&&(g(this._panRequest),this._panRequest=f(this._adjustPan.bind(this,t)))},_onDrag:function(t){var i=this._marker,e=i._shadow,n=Pt(i._icon),o=i._map.layerPointToLatLng(n);e&&Lt(e,n),i._latlng=o,t.latlng=o,t.oldLatLng=this._oldLatLng,i.fire(\\\"move\\\",t).fire(\\\"drag\\\",t)},_onDragEnd:function(t){g(this._panRequest),delete this._oldLatLng,this._marker.fire(\\\"moveend\\\").fire(\\\"dragend\\\",t)}}),Xe=Ue.extend({options:{icon:new Ke,interactive:!0,draggable:!1,autoPan:!1,autoPanPadding:[50,50],autoPanSpeed:10,keyboard:!0,title:\\\"\\\",alt:\\\"\\\",zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250,pane:\\\"markerPane\\\",bubblingMouseEvents:!1},initialize:function(t,i){l(this,i),this._latlng=C(t)},onAdd:function(t){this._zoomAnimated=this._zoomAnimated&&t.options.markerZoomAnimation,this._zoomAnimated&&t.on(\\\"zoomanim\\\",this._animateZoom,this),this._initIcon(),this.update()},onRemove:function(t){this.dragging&&this.dragging.enabled()&&(this.options.draggable=!0,this.dragging.removeHooks()),delete this.dragging,this._zoomAnimated&&t.off(\\\"zoomanim\\\",this._animateZoom,this),this._removeIcon(),this._removeShadow()},getEvents:function(){return{zoom:this.update,viewreset:this.update}},getLatLng:function(){return this._latlng},setLatLng:function(t){var i=this._latlng;return this._latlng=C(t),this.update(),this.fire(\\\"move\\\",{oldLatLng:i,latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update()},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup,this._popup.options),this},getElement:function(){return this._icon},update:function(){if(this._icon&&this._map){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,i=\\\"leaflet-zoom-\\\"+(this._zoomAnimated?\\\"animated\\\":\\\"hide\\\"),e=t.icon.createIcon(this._icon),n=!1;e!==this._icon&&(this._icon&&this._removeIcon(),n=!0,t.title&&(e.title=t.title),\\\"IMG\\\"===e.tagName&&(e.alt=t.alt||\\\"\\\")),pt(e,i),t.keyboard&&(e.tabIndex=\\\"0\\\"),this._icon=e,t.riseOnHover&&this.on({mouseover:this._bringToFront,mouseout:this._resetZIndex});var o=t.icon.createShadow(this._shadow),s=!1;o!==this._shadow&&(this._removeShadow(),s=!0),o&&(pt(o,i),o.alt=\\\"\\\"),this._shadow=o,t.opacity\u003C1&&this._updateOpacity(),n&&this.getPane().appendChild(this._icon),this._initInteraction(),o&&s&&this.getPane(\\\"shadowPane\\\").appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&this.off({mouseover:this._bringToFront,mouseout:this._resetZIndex}),ut(this._icon),this.removeInteractiveTarget(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&ut(this._shadow),this._shadow=null},_setPos:function(t){Lt(this._icon,t),this._shadow&&Lt(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var i=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(i)},_initInteraction:function(){if(this.options.interactive&&(pt(this._icon,\\\"leaflet-interactive\\\"),this.addInteractiveTarget(this._icon),Ye)){var t=this.options.draggable;this.dragging&&(t=this.dragging.enabled(),this.dragging.disable()),this.dragging=new Ye(this),t&&this.dragging.enable()}},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},_updateOpacity:function(){var t=this.options.opacity;vt(this._icon,t),this._shadow&&vt(this._shadow,t)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)},_getPopupAnchor:function(){return this.options.icon.options.popupAnchor},_getTooltipAnchor:function(){return this.options.icon.options.tooltipAnchor}}),Je=Ue.extend({options:{stroke:!0,color:\\\"#3388ff\\\",weight:3,opacity:1,lineCap:\\\"round\\\",lineJoin:\\\"round\\\",dashArray:null,dashOffset:null,fill:!1,fillColor:null,fillOpacity:.2,fillRule:\\\"evenodd\\\",interactive:!0,bubblingMouseEvents:!0},beforeAdd:function(t){this._renderer=t.getRenderer(this)},onAdd:function(){this._renderer._initPath(this),this._reset(),this._renderer._addPath(this)},onRemove:function(){this._renderer._removePath(this)},redraw:function(){return this._map&&this._renderer._updatePath(this),this},setStyle:function(t){return l(this,t),this._renderer&&this._renderer._updateStyle(this),this},bringToFront:function(){return this._renderer&&this._renderer._bringToFront(this),this},bringToBack:function(){return this._renderer&&this._renderer._bringToBack(this),this},getElement:function(){return this._path},_reset:function(){this._project(),this._update()},_clickTolerance:function(){return(this.options.stroke?this.options.weight/2:0)+this._renderer.options.tolerance}}),$e=Je.extend({options:{fill:!0,radius:10},initialize:function(t,i){l(this,i),this._latlng=C(t),this._radius=this.options.radius},setLatLng:function(t){return this._latlng=C(t),this.redraw(),this.fire(\\\"move\\\",{latlng:this._latlng})},getLatLng:function(){return this._latlng},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()},getRadius:function(){return this._radius},setStyle:function(t){var i=t&&t.radius||this._radius;return Je.prototype.setStyle.call(this,t),this.setRadius(i),this},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng),this._updateBounds()},_updateBounds:function(){var t=this._radius,i=this._radiusY||t,e=this._clickTolerance(),n=[t+e,i+e];this._pxBounds=new P(this._point.subtract(n),this._point.add(n))},_update:function(){this._map&&this._updatePath()},_updatePath:function(){this._renderer._updateCircle(this)},_empty:function(){return this._radius&&!this._renderer._bounds.intersects(this._pxBounds)},_containsPoint:function(t){return t.distanceTo(this._point)\u003C=this._radius+this._clickTolerance()}}),Qe=$e.extend({initialize:function(t,e,n){if(\\\"number\\\"==typeof e&&(e=i({},n,{radius:e})),l(this,e),this._latlng=C(t),isNaN(this.options.radius))throw new Error(\\\"Circle radius cannot be NaN\\\");this._mRadius=this.options.radius},setRadius:function(t){return this._mRadius=t,this.redraw()},getRadius:function(){return this._mRadius},getBounds:function(){var t=[this._radius,this._radiusY||this._radius];return new T(this._map.layerPointToLatLng(this._point.subtract(t)),this._map.layerPointToLatLng(this._point.add(t)))},setStyle:Je.prototype.setStyle,_project:function(){var t=this._latlng.lng,i=this._latlng.lat,e=this._map,n=e.options.crs;if(n.distance===_i.distance){var o=Math.PI/180,s=this._mRadius/_i.R/o,r=e.project([i+s,t]),a=e.project([i-s,t]),h=r.add(a).divideBy(2),u=e.unproject(h).lat,l=Math.acos((Math.cos(s*o)-Math.sin(i*o)*Math.sin(u*o))/(Math.cos(i*o)*Math.cos(u*o)))/o;(isNaN(l)||0===l)&&(l=s/Math.cos(Math.PI/180*i)),this._point=h.subtract(e.getPixelOrigin()),this._radius=isNaN(l)?0:h.x-e.project([u,t-l]).x,this._radiusY=h.y-r.y}else{var c=n.unproject(n.project(this._latlng).subtract([this._mRadius,0]));this._point=e.latLngToLayerPoint(this._latlng),this._radius=this._point.x-e.latLngToLayerPoint(c).x}this._updateBounds()}}),tn=Je.extend({options:{smoothFactor:1,noClip:!1},initialize:function(t,i){l(this,i),this._setLatLngs(t)},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._setLatLngs(t),this.redraw()},isEmpty:function(){return!this._latlngs.length},closestLayerPoint:function(t){for(var i,e,n=1/0,o=null,s=Rt,r=0,a=this._parts.length;r\u003Ca;r++)for(var h=this._parts[r],u=1,l=h.length;u\u003Cl;u++){var c=s(t,i=h[u-1],e=h[u],!0);c\u003Cn&&(n=c,o=s(t,i,e))}return o&&(o.distance=Math.sqrt(n)),o},getCenter:function(){if(!this._map)throw new Error(\\\"Must add layer to map before using getCenter()\\\");var t,i,e,n,o,s,r,a=this._rings[0],h=a.length;if(!h)return null;for(t=0,i=0;t\u003Ch-1;t++)i+=a[t].distanceTo(a[t+1])/2;if(0===i)return this._map.layerPointToLatLng(a[0]);for(t=0,n=0;t\u003Ch-1;t++)if(o=a[t],s=a[t+1],e=o.distanceTo(s),(n+=e)>i)return r=(n-i)/e,this._map.layerPointToLatLng([s.x-r*(s.x-o.x),s.y-r*(s.y-o.y)])},getBounds:function(){return this._bounds},addLatLng:function(t,i){return i=i||this._defaultShape(),t=C(t),i.push(t),this._bounds.extend(t),this.redraw()},_setLatLngs:function(t){this._bounds=new T,this._latlngs=this._convertLatLngs(t)},_defaultShape:function(){return Dt(this._latlngs)?this._latlngs:this._latlngs[0]},_convertLatLngs:function(t){for(var i=[],e=Dt(t),n=0,o=t.length;n\u003Co;n++)e?(i[n]=C(t[n]),this._bounds.extend(i[n])):i[n]=this._convertLatLngs(t[n]);return i},_project:function(){var t=new P;this._rings=[],this._projectLatlngs(this._latlngs,this._rings,t);var i=this._clickTolerance(),e=new x(i,i);this._bounds.isValid()&&t.isValid()&&(t.min._subtract(e),t.max._add(e),this._pxBounds=t)},_projectLatlngs:function(t,i,e){var n,o,s=t[0]instanceof M,r=t.length;if(s){for(o=[],n=0;n\u003Cr;n++)o[n]=this._map.latLngToLayerPoint(t[n]),e.extend(o[n]);i.push(o)}else for(n=0;n\u003Cr;n++)this._projectLatlngs(t[n],i,e)},_clipPoints:function(){var t=this._renderer._bounds;if(this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else{var i,e,n,o,s,r,a,h=this._parts;for(i=0,n=0,o=this._rings.length;i\u003Co;i++)for(e=0,s=(a=this._rings[i]).length;e\u003Cs-1;e++)(r=It(a[e],a[e+1],t,e,!0))&&(h[n]=h[n]||[],h[n].push(r[0]),r[1]===a[e+1]&&e!==s-2||(h[n].push(r[1]),n++))}},_simplifyPoints:function(){for(var t=this._parts,i=this.options.smoothFactor,e=0,n=t.length;e\u003Cn;e++)t[e]=Ct(t[e],i)},_update:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),this._updatePath())},_updatePath:function(){this._renderer._updatePoly(this)},_containsPoint:function(t,i){var e,n,o,s,r,a,h=this._clickTolerance();if(!this._pxBounds||!this._pxBounds.contains(t))return!1;for(e=0,s=this._parts.length;e\u003Cs;e++)for(n=0,o=(r=(a=this._parts[e]).length)-1;n\u003Cr;o=n++)if((i||0!==n)&&Zt(t,a[o],a[n])\u003C=h)return!0;return!1}});tn._flat=Nt;var en=tn.extend({options:{fill:!0},isEmpty:function(){return!this._latlngs.length||!this._latlngs[0].length},getCenter:function(){if(!this._map)throw new Error(\\\"Must add layer to map before using getCenter()\\\");var t,i,e,n,o,s,r,a,h,u=this._rings[0],l=u.length;if(!l)return null;for(s=r=a=0,t=0,i=l-1;t\u003Cl;i=t++)e=u[t],n=u[i],o=e.y*n.x-n.y*e.x,r+=(e.x+n.x)*o,a+=(e.y+n.y)*o,s+=3*o;return h=0===s?u[0]:[r/s,a/s],this._map.layerPointToLatLng(h)},_convertLatLngs:function(t){var i=tn.prototype._convertLatLngs.call(this,t),e=i.length;return e>=2&&i[0]instanceof M&&i[0].equals(i[e-1])&&i.pop(),i},_setLatLngs:function(t){tn.prototype._setLatLngs.call(this,t),Dt(this._latlngs)&&(this._latlngs=[this._latlngs])},_defaultShape:function(){return Dt(this._latlngs[0])?this._latlngs[0]:this._latlngs[0][0]},_clipPoints:function(){var t=this._renderer._bounds,i=this.options.weight,e=new x(i,i);if(t=new P(t.min.subtract(e),t.max.add(e)),this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else for(var n,o=0,s=this._rings.length;o\u003Cs;o++)(n=jt(this._rings[o],t,!0)).length&&this._parts.push(n)},_updatePath:function(){this._renderer._updatePoly(this,!0)},_containsPoint:function(t){var i,e,n,o,s,r,a,h,u=!1;if(!this._pxBounds.contains(t))return!1;for(o=0,a=this._parts.length;o\u003Ca;o++)for(s=0,r=(h=(i=this._parts[o]).length)-1;s\u003Ch;r=s++)e=i[s],n=i[r],e.y>t.y!=n.y>t.y&&t.x\u003C(n.x-e.x)*(t.y-e.y)/(n.y-e.y)+e.x&&(u=!u);return u||tn.prototype._containsPoint.call(this,t,!0)}}),nn=qe.extend({initialize:function(t,i){l(this,i),this._layers={},t&&this.addData(t)},addData:function(t){var i,e,n,o=ei(t)?t:t.features;if(o){for(i=0,e=o.length;i\u003Ce;i++)((n=o[i]).geometries||n.geometry||n.features||n.coordinates)&&this.addData(n);return this}var s=this.options;if(s.filter&&!s.filter(t))return this;var r=Wt(t,s);return r?(r.feature=Gt(t),r.defaultOptions=r.options,this.resetStyle(r),s.onEachFeature&&s.onEachFeature(t,r),this.addLayer(r)):this},resetStyle:function(t){return t.options=i({},t.defaultOptions),this._setLayerStyle(t,this.options.style),this},setStyle:function(t){return this.eachLayer(function(i){this._setLayerStyle(i,t)},this)},_setLayerStyle:function(t,i){\\\"function\\\"==typeof i&&(i=i(t.feature)),t.setStyle&&t.setStyle(i)}}),on={toGeoJSON:function(t){return qt(this,{type:\\\"Point\\\",coordinates:Ut(this.getLatLng(),t)})}};Xe.include(on),Qe.include(on),$e.include(on),tn.include({toGeoJSON:function(t){var i=!Dt(this._latlngs),e=Vt(this._latlngs,i?1:0,!1,t);return qt(this,{type:(i?\\\"Multi\\\":\\\"\\\")+\\\"LineString\\\",coordinates:e})}}),en.include({toGeoJSON:function(t){var i=!Dt(this._latlngs),e=i&&!Dt(this._latlngs[0]),n=Vt(this._latlngs,e?2:i?1:0,!0,t);return i||(n=[n]),qt(this,{type:(e?\\\"Multi\\\":\\\"\\\")+\\\"Polygon\\\",coordinates:n})}}),Ve.include({toMultiPoint:function(t){var i=[];return this.eachLayer(function(e){i.push(e.toGeoJSON(t).geometry.coordinates)}),qt(this,{type:\\\"MultiPoint\\\",coordinates:i})},toGeoJSON:function(t){var i=this.feature&&this.feature.geometry&&this.feature.geometry.type;if(\\\"MultiPoint\\\"===i)return this.toMultiPoint(t);var e=\\\"GeometryCollection\\\"===i,n=[];return this.eachLayer(function(i){if(i.toGeoJSON){var o=i.toGeoJSON(t);if(e)n.push(o.geometry);else{var s=Gt(o);\\\"FeatureCollection\\\"===s.type?n.push.apply(n,s.features):n.push(s)}}}),e?qt(this,{geometries:n,type:\\\"GeometryCollection\\\"}):{type:\\\"FeatureCollection\\\",features:n}}});var sn=Kt,rn=Ue.extend({options:{opacity:1,alt:\\\"\\\",interactive:!1,crossOrigin:!1,errorOverlayUrl:\\\"\\\",zIndex:1,className:\\\"\\\"},initialize:function(t,i,e){this._url=t,this._bounds=z(i),l(this,e)},onAdd:function(){this._image||(this._initImage(),this.options.opacity\u003C1&&this._updateOpacity()),this.options.interactive&&(pt(this._image,\\\"leaflet-interactive\\\"),this.addInteractiveTarget(this._image)),this.getPane().appendChild(this._image),this._reset()},onRemove:function(){ut(this._image),this.options.interactive&&this.removeInteractiveTarget(this._image)},setOpacity:function(t){return this.options.opacity=t,this._image&&this._updateOpacity(),this},setStyle:function(t){return t.opacity&&this.setOpacity(t.opacity),this},bringToFront:function(){return this._map&&ct(this._image),this},bringToBack:function(){return this._map&&_t(this._image),this},setUrl:function(t){return this._url=t,this._image&&(this._image.src=t),this},setBounds:function(t){return this._bounds=z(t),this._map&&this._reset(),this},getEvents:function(){var t={zoom:this._reset,viewreset:this._reset};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},getBounds:function(){return this._bounds},getElement:function(){return this._image},_initImage:function(){var t=\\\"IMG\\\"===this._url.tagName,i=this._image=t?this._url:ht(\\\"img\\\");pt(i,\\\"leaflet-image-layer\\\"),this._zoomAnimated&&pt(i,\\\"leaflet-zoom-animated\\\"),this.options.className&&pt(i,this.options.className),i.onselectstart=r,i.onmousemove=r,i.onload=e(this.fire,this,\\\"load\\\"),i.onerror=e(this._overlayOnError,this,\\\"error\\\"),this.options.crossOrigin&&(i.crossOrigin=\\\"\\\"),this.options.zIndex&&this._updateZIndex(),t?this._url=i.src:(i.src=this._url,i.alt=this.options.alt)},_animateZoom:function(t){var i=this._map.getZoomScale(t.zoom),e=this._map._latLngBoundsToNewLayerBounds(this._bounds,t.zoom,t.center).min;wt(this._image,e,i)},_reset:function(){var t=this._image,i=new P(this._map.latLngToLayerPoint(this._bounds.getNorthWest()),this._map.latLngToLayerPoint(this._bounds.getSouthEast())),e=i.getSize();Lt(t,i.min),t.style.width=e.x+\\\"px\\\",t.style.height=e.y+\\\"px\\\"},_updateOpacity:function(){vt(this._image,this.options.opacity)},_updateZIndex:function(){this._image&&void 0!==this.options.zIndex&&null!==this.options.zIndex&&(this._image.style.zIndex=this.options.zIndex)},_overlayOnError:function(){this.fire(\\\"error\\\");var t=this.options.errorOverlayUrl;t&&this._url!==t&&(this._url=t,this._image.src=t)}}),an=rn.extend({options:{autoplay:!0,loop:!0},_initImage:function(){var t=\\\"VIDEO\\\"===this._url.tagName,i=this._image=t?this._url:ht(\\\"video\\\");if(pt(i,\\\"leaflet-image-layer\\\"),this._zoomAnimated&&pt(i,\\\"leaflet-zoom-animated\\\"),i.onselectstart=r,i.onmousemove=r,i.onloadeddata=e(this.fire,this,\\\"load\\\"),t){for(var n=i.getElementsByTagName(\\\"source\\\"),o=[],s=0;s\u003Cn.length;s++)o.push(n[s].src);this._url=n.length>0?o:[i.src]}else{ei(this._url)||(this._url=[this._url]),i.autoplay=!!this.options.autoplay,i.loop=!!this.options.loop;for(var a=0;a\u003Cthis._url.length;a++){var h=ht(\\\"source\\\");h.src=this._url[a],i.appendChild(h)}}}}),hn=Ue.extend({options:{offset:[0,7],className:\\\"\\\",pane:\\\"popupPane\\\"},initialize:function(t,i){l(this,t),this._source=i},onAdd:function(t){this._zoomAnimated=t._zoomAnimated,this._container||this._initLayout(),t._fadeAnimated&&vt(this._container,0),clearTimeout(this._removeTimeout),this.getPane().appendChild(this._container),this.update(),t._fadeAnimated&&vt(this._container,1),this.bringToFront()},onRemove:function(t){t._fadeAnimated?(vt(this._container,0),this._removeTimeout=setTimeout(e(ut,void 0,this._container),200)):ut(this._container)},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=C(t),this._map&&(this._updatePosition(),this._adjustPan()),this},getContent:function(){return this._content},setContent:function(t){return this._content=t,this.update(),this},getElement:function(){return this._container},update:function(){this._map&&(this._container.style.visibility=\\\"hidden\\\",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility=\\\"\\\",this._adjustPan())},getEvents:function(){var t={zoom:this._updatePosition,viewreset:this._updatePosition};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},isOpen:function(){return!!this._map&&this._map.hasLayer(this)},bringToFront:function(){return this._map&&ct(this._container),this},bringToBack:function(){return this._map&&_t(this._container),this},_updateContent:function(){if(this._content){var t=this._contentNode,i=\\\"function\\\"==typeof this._content?this._content(this._source||this):this._content;if(\\\"string\\\"==typeof i)t.innerHTML=i;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(i)}this.fire(\\\"contentupdate\\\")}},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),i=w(this.options.offset),e=this._getAnchor();this._zoomAnimated?Lt(this._container,t.add(e)):i=i.add(t).add(e);var n=this._containerBottom=-i.y,o=this._containerLeft=-Math.round(this._containerWidth/2)+i.x;this._container.style.bottom=n+\\\"px\\\",this._container.style.left=o+\\\"px\\\"}},_getAnchor:function(){return[0,0]}}),un=hn.extend({options:{maxWidth:300,minWidth:50,maxHeight:null,autoPan:!0,autoPanPaddingTopLeft:null,autoPanPaddingBottomRight:null,autoPanPadding:[5,5],keepInView:!1,closeButton:!0,autoClose:!0,closeOnEscapeKey:!0,className:\\\"\\\"},openOn:function(t){return t.openPopup(this),this},onAdd:function(t){hn.prototype.onAdd.call(this,t),t.fire(\\\"popupopen\\\",{popup:this}),this._source&&(this._source.fire(\\\"popupopen\\\",{popup:this},!0),this._source instanceof Je||this._source.on(\\\"preclick\\\",Y))},onRemove:function(t){hn.prototype.onRemove.call(this,t),t.fire(\\\"popupclose\\\",{popup:this}),this._source&&(this._source.fire(\\\"popupclose\\\",{popup:this},!0),this._source instanceof Je||this._source.off(\\\"preclick\\\",Y))},getEvents:function(){var t=hn.prototype.getEvents.call(this);return(void 0!==this.options.closeOnClick?this.options.closeOnClick:this._map.options.closePopupOnClick)&&(t.preclick=this._close),this.options.keepInView&&(t.moveend=this._adjustPan),t},_close:function(){this._map&&this._map.closePopup(this)},_initLayout:function(){var t=\\\"leaflet-popup\\\",i=this._container=ht(\\\"div\\\",t+\\\" \\\"+(this.options.className||\\\"\\\")+\\\" leaflet-zoom-animated\\\"),e=this._wrapper=ht(\\\"div\\\",t+\\\"-content-wrapper\\\",i);if(this._contentNode=ht(\\\"div\\\",t+\\\"-content\\\",e),J(e),X(this._contentNode),V(e,\\\"contextmenu\\\",Y),this._tipContainer=ht(\\\"div\\\",t+\\\"-tip-container\\\",i),this._tip=ht(\\\"div\\\",t+\\\"-tip\\\",this._tipContainer),this.options.closeButton){var n=this._closeButton=ht(\\\"a\\\",t+\\\"-close-button\\\",i);n.href=\\\"#close\\\",n.innerHTML=\\\"×\\\",V(n,\\\"click\\\",this._onCloseButtonClick,this)}},_updateLayout:function(){var t=this._contentNode,i=t.style;i.width=\\\"\\\",i.whiteSpace=\\\"nowrap\\\";var e=t.offsetWidth;e=Math.min(e,this.options.maxWidth),e=Math.max(e,this.options.minWidth),i.width=e+1+\\\"px\\\",i.whiteSpace=\\\"\\\",i.height=\\\"\\\";var n=t.offsetHeight,o=this.options.maxHeight;o&&n>o?(i.height=o+\\\"px\\\",pt(t,\\\"leaflet-popup-scrolled\\\")):mt(t,\\\"leaflet-popup-scrolled\\\"),this._containerWidth=this._container.offsetWidth},_animateZoom:function(t){var i=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center),e=this._getAnchor();Lt(this._container,i.add(e))},_adjustPan:function(){if(!(!this.options.autoPan||this._map._panAnim&&this._map._panAnim._inProgress)){var t=this._map,i=parseInt(at(this._container,\\\"marginBottom\\\"),10)||0,e=this._container.offsetHeight+i,n=this._containerWidth,o=new x(this._containerLeft,-e-this._containerBottom);o._add(Pt(this._container));var s=t.layerPointToContainerPoint(o),r=w(this.options.autoPanPadding),a=w(this.options.autoPanPaddingTopLeft||r),h=w(this.options.autoPanPaddingBottomRight||r),u=t.getSize(),l=0,c=0;s.x+n+h.x>u.x&&(l=s.x+n-u.x+h.x),s.x-l-a.x\u003C0&&(l=s.x-a.x),s.y+e+h.y>u.y&&(c=s.y+e-u.y+h.y),s.y-c-a.y\u003C0&&(c=s.y-a.y),(l||c)&&t.fire(\\\"autopanstart\\\").panBy([l,c])}},_onCloseButtonClick:function(t){this._close(),Q(t)},_getAnchor:function(){return w(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});Le.mergeOptions({closePopupOnClick:!0}),Le.include({openPopup:function(t,i,e){return t instanceof un||(t=new un(e).setContent(t)),i&&t.setLatLng(i),this.hasLayer(t)?this:(this._popup&&this._popup.options.autoClose&&this.closePopup(),this._popup=t,this.addLayer(t))},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&this.removeLayer(t),this}}),Ue.include({bindPopup:function(t,i){return t instanceof un?(l(t,i),this._popup=t,t._source=this):(this._popup&&!i||(this._popup=new un(i,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t,i){if(t instanceof Ue||(i=t,t=this),t instanceof qe)for(var e in this._layers){t=this._layers[e];break}return i||(i=t.getCenter?t.getCenter():t.getLatLng()),this._popup&&this._map&&(this._popup._source=t,this._popup.update(),this._map.openPopup(this._popup,i)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(t){return this._popup&&(this._popup._map?this.closePopup():this.openPopup(t)),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var i=t.layer||t.target;this._popup&&this._map&&(Q(t),i instanceof Je?this.openPopup(t.layer||t.target,t.latlng):this._map.hasLayer(this._popup)&&this._popup._source===i?this.closePopup():this.openPopup(i,t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}});var ln=hn.extend({options:{pane:\\\"tooltipPane\\\",offset:[0,0],direction:\\\"auto\\\",permanent:!1,sticky:!1,interactive:!1,opacity:.9},onAdd:function(t){hn.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire(\\\"tooltipopen\\\",{tooltip:this}),this._source&&this._source.fire(\\\"tooltipopen\\\",{tooltip:this},!0)},onRemove:function(t){hn.prototype.onRemove.call(this,t),t.fire(\\\"tooltipclose\\\",{tooltip:this}),this._source&&this._source.fire(\\\"tooltipclose\\\",{tooltip:this},!0)},getEvents:function(){var t=hn.prototype.getEvents.call(this);return Vi&&!this.options.permanent&&(t.preclick=this._close),t},_close:function(){this._map&&this._map.closeTooltip(this)},_initLayout:function(){var t=\\\"leaflet-tooltip \\\"+(this.options.className||\\\"\\\")+\\\" leaflet-zoom-\\\"+(this._zoomAnimated?\\\"animated\\\":\\\"hide\\\");this._contentNode=this._container=ht(\\\"div\\\",t)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var i=this._map,e=this._container,n=i.latLngToContainerPoint(i.getCenter()),o=i.layerPointToContainerPoint(t),s=this.options.direction,r=e.offsetWidth,a=e.offsetHeight,h=w(this.options.offset),u=this._getAnchor();\\\"top\\\"===s?t=t.add(w(-r/2+h.x,-a+h.y+u.y,!0)):\\\"bottom\\\"===s?t=t.subtract(w(r/2-h.x,-h.y,!0)):\\\"center\\\"===s?t=t.subtract(w(r/2+h.x,a/2-u.y+h.y,!0)):\\\"right\\\"===s||\\\"auto\\\"===s&&o.x\u003Cn.x?(s=\\\"right\\\",t=t.add(w(h.x+u.x,u.y-a/2+h.y,!0))):(s=\\\"left\\\",t=t.subtract(w(r+u.x-h.x,a/2-u.y-h.y,!0))),mt(e,\\\"leaflet-tooltip-right\\\"),mt(e,\\\"leaflet-tooltip-left\\\"),mt(e,\\\"leaflet-tooltip-top\\\"),mt(e,\\\"leaflet-tooltip-bottom\\\"),pt(e,\\\"leaflet-tooltip-\\\"+s),Lt(e,t)},_updatePosition:function(){var t=this._map.latLngToLayerPoint(this._latlng);this._setPosition(t)},setOpacity:function(t){this.options.opacity=t,this._container&&vt(this._container,t)},_animateZoom:function(t){var i=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPosition(i)},_getAnchor:function(){return w(this._source&&this._source._getTooltipAnchor&&!this.options.sticky?this._source._getTooltipAnchor():[0,0])}});Le.include({openTooltip:function(t,i,e){return t instanceof ln||(t=new ln(e).setContent(t)),i&&t.setLatLng(i),this.hasLayer(t)?this:this.addLayer(t)},closeTooltip:function(t){return t&&this.removeLayer(t),this}}),Ue.include({bindTooltip:function(t,i){return t instanceof ln?(l(t,i),this._tooltip=t,t._source=this):(this._tooltip&&!i||(this._tooltip=new ln(i,this)),this._tooltip.setContent(t)),this._initTooltipInteractions(),this._tooltip.options.permanent&&this._map&&this._map.hasLayer(this)&&this.openTooltip(),this},unbindTooltip:function(){return this._tooltip&&(this._initTooltipInteractions(!0),this.closeTooltip(),this._tooltip=null),this},_initTooltipInteractions:function(t){if(t||!this._tooltipHandlersAdded){var i=t?\\\"off\\\":\\\"on\\\",e={remove:this.closeTooltip,move:this._moveTooltip};this._tooltip.options.permanent?e.add=this._openTooltip:(e.mouseover=this._openTooltip,e.mouseout=this.closeTooltip,this._tooltip.options.sticky&&(e.mousemove=this._moveTooltip),Vi&&(e.click=this._openTooltip)),this[i](e),this._tooltipHandlersAdded=!t}},openTooltip:function(t,i){if(t instanceof Ue||(i=t,t=this),t instanceof qe)for(var e in this._layers){t=this._layers[e];break}return i||(i=t.getCenter?t.getCenter():t.getLatLng()),this._tooltip&&this._map&&(this._tooltip._source=t,this._tooltip.update(),this._map.openTooltip(this._tooltip,i),this._tooltip.options.interactive&&this._tooltip._container&&(pt(this._tooltip._container,\\\"leaflet-clickable\\\"),this.addInteractiveTarget(this._tooltip._container))),this},closeTooltip:function(){return this._tooltip&&(this._tooltip._close(),this._tooltip.options.interactive&&this._tooltip._container&&(mt(this._tooltip._container,\\\"leaflet-clickable\\\"),this.removeInteractiveTarget(this._tooltip._container))),this},toggleTooltip:function(t){return this._tooltip&&(this._tooltip._map?this.closeTooltip():this.openTooltip(t)),this},isTooltipOpen:function(){return this._tooltip.isOpen()},setTooltipContent:function(t){return this._tooltip&&this._tooltip.setContent(t),this},getTooltip:function(){return this._tooltip},_openTooltip:function(t){var i=t.layer||t.target;this._tooltip&&this._map&&this.openTooltip(i,this._tooltip.options.sticky?t.latlng:void 0)},_moveTooltip:function(t){var i,e,n=t.latlng;this._tooltip.options.sticky&&t.originalEvent&&(i=this._map.mouseEventToContainerPoint(t.originalEvent),e=this._map.containerPointToLayerPoint(i),n=this._map.layerPointToLatLng(e)),this._tooltip.setLatLng(n)}});var cn=Ge.extend({options:{iconSize:[12,12],html:!1,bgPos:null,className:\\\"leaflet-div-icon\\\"},createIcon:function(t){var i=t&&\\\"DIV\\\"===t.tagName?t:document.createElement(\\\"div\\\"),e=this.options;if(i.innerHTML=!1!==e.html?e.html:\\\"\\\",e.bgPos){var n=w(e.bgPos);i.style.backgroundPosition=-n.x+\\\"px \\\"+-n.y+\\\"px\\\"}return this._setIconStyles(i,\\\"icon\\\"),i},createShadow:function(){return null}});Ge.Default=Ke;var _n=Ue.extend({options:{tileSize:256,opacity:1,updateWhenIdle:ji,updateWhenZooming:!0,updateInterval:200,zIndex:1,bounds:null,minZoom:0,maxZoom:void 0,maxNativeZoom:void 0,minNativeZoom:void 0,noWrap:!1,pane:\\\"tilePane\\\",className:\\\"\\\",keepBuffer:2},initialize:function(t){l(this,t)},onAdd:function(){this._initContainer(),this._levels={},this._tiles={},this._resetView(),this._update()},beforeAdd:function(t){t._addZoomLimit(this)},onRemove:function(t){this._removeAllTiles(),ut(this._container),t._removeZoomLimit(this),this._container=null,this._tileZoom=void 0},bringToFront:function(){return this._map&&(ct(this._container),this._setAutoZIndex(Math.max)),this},bringToBack:function(){return this._map&&(_t(this._container),this._setAutoZIndex(Math.min)),this},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},isLoading:function(){return this._loading},redraw:function(){return this._map&&(this._removeAllTiles(),this._update()),this},getEvents:function(){var t={viewprereset:this._invalidateAll,viewreset:this._resetView,zoom:this._resetView,moveend:this._onMoveEnd};return this.options.updateWhenIdle||(this._onMove||(this._onMove=o(this._onMoveEnd,this.options.updateInterval,this)),t.move=this._onMove),this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},createTile:function(){return document.createElement(\\\"div\\\")},getTileSize:function(){var t=this.options.tileSize;return t instanceof x?t:new x(t,t)},_updateZIndex:function(){this._container&&void 0!==this.options.zIndex&&null!==this.options.zIndex&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t){for(var i,e=this.getPane().children,n=-t(-1/0,1/0),o=0,s=e.length;o\u003Cs;o++)i=e[o].style.zIndex,e[o]!==this._container&&i&&(n=t(n,+i));isFinite(n)&&(this.options.zIndex=n+t(-1,1),this._updateZIndex())},_updateOpacity:function(){if(this._map&&!Li){vt(this._container,this.options.opacity);var t=+new Date,i=!1,e=!1;for(var n in this._tiles){var o=this._tiles[n];if(o.current&&o.loaded){var s=Math.min(1,(t-o.loaded)/200);vt(o.el,s),s\u003C1?i=!0:(o.active?e=!0:this._onOpaqueTile(o),o.active=!0)}}e&&!this._noPrune&&this._pruneTiles(),i&&(g(this._fadeFrame),this._fadeFrame=f(this._updateOpacity,this))}},_onOpaqueTile:r,_initContainer:function(){this._container||(this._container=ht(\\\"div\\\",\\\"leaflet-layer \\\"+(this.options.className||\\\"\\\")),this._updateZIndex(),this.options.opacity\u003C1&&this._updateOpacity(),this.getPane().appendChild(this._container))},_updateLevels:function(){var t=this._tileZoom,i=this.options.maxZoom;if(void 0!==t){for(var e in this._levels)this._levels[e].el.children.length||e===t?(this._levels[e].el.style.zIndex=i-Math.abs(t-e),this._onUpdateLevel(e)):(ut(this._levels[e].el),this._removeTilesAtZoom(e),this._onRemoveLevel(e),delete this._levels[e]);var n=this._levels[t],o=this._map;return n||((n=this._levels[t]={}).el=ht(\\\"div\\\",\\\"leaflet-tile-container leaflet-zoom-animated\\\",this._container),n.el.style.zIndex=i,n.origin=o.project(o.unproject(o.getPixelOrigin()),t).round(),n.zoom=t,this._setZoomTransform(n,o.getCenter(),o.getZoom()),n.el.offsetWidth,this._onCreateLevel(n)),this._level=n,n}},_onUpdateLevel:r,_onRemoveLevel:r,_onCreateLevel:r,_pruneTiles:function(){if(this._map){var t,i,e=this._map.getZoom();if(e>this.options.maxZoom||e\u003Cthis.options.minZoom)this._removeAllTiles();else{for(t in this._tiles)(i=this._tiles[t]).retain=i.current;for(t in this._tiles)if((i=this._tiles[t]).current&&!i.active){var n=i.coords;this._retainParent(n.x,n.y,n.z,n.z-5)||this._retainChildren(n.x,n.y,n.z,n.z+2)}for(t in this._tiles)this._tiles[t].retain||this._removeTile(t)}}},_removeTilesAtZoom:function(t){for(var i in this._tiles)this._tiles[i].coords.z===t&&this._removeTile(i)},_removeAllTiles:function(){for(var t in this._tiles)this._removeTile(t)},_invalidateAll:function(){for(var t in this._levels)ut(this._levels[t].el),this._onRemoveLevel(t),delete this._levels[t];this._removeAllTiles(),this._tileZoom=void 0},_retainParent:function(t,i,e,n){var o=Math.floor(t/2),s=Math.floor(i/2),r=e-1,a=new x(+o,+s);a.z=+r;var h=this._tileCoordsToKey(a),u=this._tiles[h];return u&&u.active?(u.retain=!0,!0):(u&&u.loaded&&(u.retain=!0),r>n&&this._retainParent(o,s,r,n))},_retainChildren:function(t,i,e,n){for(var o=2*t;o\u003C2*t+2;o++)for(var s=2*i;s\u003C2*i+2;s++){var r=new x(o,s);r.z=e+1;var a=this._tileCoordsToKey(r),h=this._tiles[a];h&&h.active?h.retain=!0:(h&&h.loaded&&(h.retain=!0),e+1\u003Cn&&this._retainChildren(o,s,e+1,n))}},_resetView:function(t){var i=t&&(t.pinch||t.flyTo);this._setView(this._map.getCenter(),this._map.getZoom(),i,i)},_animateZoom:function(t){this._setView(t.center,t.zoom,!0,t.noUpdate)},_clampZoom:function(t){var i=this.options;return void 0!==i.minNativeZoom&&t\u003Ci.minNativeZoom?i.minNativeZoom:void 0!==i.maxNativeZoom&&i.maxNativeZoom\u003Ct?i.maxNativeZoom:t},_setView:function(t,i,e,n){var o=this._clampZoom(Math.round(i));(void 0!==this.options.maxZoom&&o>this.options.maxZoom||void 0!==this.options.minZoom&&o\u003Cthis.options.minZoom)&&(o=void 0);var s=this.options.updateWhenZooming&&o!==this._tileZoom;n&&!s||(this._tileZoom=o,this._abortLoading&&this._abortLoading(),this._updateLevels(),this._resetGrid(),void 0!==o&&this._update(t),e||this._pruneTiles(),this._noPrune=!!e),this._setZoomTransforms(t,i)},_setZoomTransforms:function(t,i){for(var e in this._levels)this._setZoomTransform(this._levels[e],t,i)},_setZoomTransform:function(t,i,e){var n=this._map.getZoomScale(e,t.zoom),o=t.origin.multiplyBy(n).subtract(this._map._getNewPixelOrigin(i,e)).round();Ni?wt(t.el,o,n):Lt(t.el,o)},_resetGrid:function(){var t=this._map,i=t.options.crs,e=this._tileSize=this.getTileSize(),n=this._tileZoom,o=this._map.getPixelWorldBounds(this._tileZoom);o&&(this._globalTileRange=this._pxBoundsToTileRange(o)),this._wrapX=i.wrapLng&&!this.options.noWrap&&[Math.floor(t.project([0,i.wrapLng[0]],n).x/e.x),Math.ceil(t.project([0,i.wrapLng[1]],n).x/e.y)],this._wrapY=i.wrapLat&&!this.options.noWrap&&[Math.floor(t.project([i.wrapLat[0],0],n).y/e.x),Math.ceil(t.project([i.wrapLat[1],0],n).y/e.y)]},_onMoveEnd:function(){this._map&&!this._map._animatingZoom&&this._update()},_getTiledPixelBounds:function(t){var i=this._map,e=i._animatingZoom?Math.max(i._animateToZoom,i.getZoom()):i.getZoom(),n=i.getZoomScale(e,this._tileZoom),o=i.project(t,this._tileZoom).floor(),s=i.getSize().divideBy(2*n);return new P(o.subtract(s),o.add(s))},_update:function(t){var i=this._map;if(i){var e=this._clampZoom(i.getZoom());if(void 0===t&&(t=i.getCenter()),void 0!==this._tileZoom){var n=this._getTiledPixelBounds(t),o=this._pxBoundsToTileRange(n),s=o.getCenter(),r=[],a=this.options.keepBuffer,h=new P(o.getBottomLeft().subtract([a,-a]),o.getTopRight().add([a,-a]));if(!(isFinite(o.min.x)&&isFinite(o.min.y)&&isFinite(o.max.x)&&isFinite(o.max.y)))throw new Error(\\\"Attempted to load an infinite number of tiles\\\");for(var u in this._tiles){var l=this._tiles[u].coords;l.z===this._tileZoom&&h.contains(new x(l.x,l.y))||(this._tiles[u].current=!1)}if(Math.abs(e-this._tileZoom)>1)this._setView(t,e);else{for(var c=o.min.y;c\u003C=o.max.y;c++)for(var _=o.min.x;_\u003C=o.max.x;_++){var d=new x(_,c);if(d.z=this._tileZoom,this._isValidTile(d)){var p=this._tiles[this._tileCoordsToKey(d)];p?p.current=!0:r.push(d)}}if(r.sort(function(t,i){return t.distanceTo(s)-i.distanceTo(s)}),0!==r.length){this._loading||(this._loading=!0,this.fire(\\\"loading\\\"));var m=document.createDocumentFragment();for(_=0;_\u003Cr.length;_++)this._addTile(r[_],m);this._level.el.appendChild(m)}}}}},_isValidTile:function(t){var i=this._map.options.crs;if(!i.infinite){var e=this._globalTileRange;if(!i.wrapLng&&(t.x\u003Ce.min.x||t.x>e.max.x)||!i.wrapLat&&(t.y\u003Ce.min.y||t.y>e.max.y))return!1}if(!this.options.bounds)return!0;var n=this._tileCoordsToBounds(t);return z(this.options.bounds).overlaps(n)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var i=this._map,e=this.getTileSize(),n=t.scaleBy(e),o=n.add(e);return[i.unproject(n,t.z),i.unproject(o,t.z)]},_tileCoordsToBounds:function(t){var i=this._tileCoordsToNwSe(t),e=new T(i[0],i[1]);return this.options.noWrap||(e=this._map.wrapLatLngBounds(e)),e},_tileCoordsToKey:function(t){return t.x+\\\":\\\"+t.y+\\\":\\\"+t.z},_keyToTileCoords:function(t){var i=t.split(\\\":\\\"),e=new x(+i[0],+i[1]);return e.z=+i[2],e},_removeTile:function(t){var i=this._tiles[t];i&&(Ci||i.el.setAttribute(\\\"src\\\",ni),ut(i.el),delete this._tiles[t],this.fire(\\\"tileunload\\\",{tile:i.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){pt(t,\\\"leaflet-tile\\\");var i=this.getTileSize();t.style.width=i.x+\\\"px\\\",t.style.height=i.y+\\\"px\\\",t.onselectstart=r,t.onmousemove=r,Li&&this.options.opacity\u003C1&&vt(t,this.options.opacity),Ti&&!zi&&(t.style.WebkitBackfaceVisibility=\\\"hidden\\\")},_addTile:function(t,i){var n=this._getTilePos(t),o=this._tileCoordsToKey(t),s=this.createTile(this._wrapCoords(t),e(this._tileReady,this,t));this._initTile(s),this.createTile.length\u003C2&&f(e(this._tileReady,this,t,null,s)),Lt(s,n),this._tiles[o]={el:s,coords:t,current:!0},i.appendChild(s),this.fire(\\\"tileloadstart\\\",{tile:s,coords:t})},_tileReady:function(t,i,n){if(this._map){i&&this.fire(\\\"tileerror\\\",{error:i,tile:n,coords:t});var o=this._tileCoordsToKey(t);(n=this._tiles[o])&&(n.loaded=+new Date,this._map._fadeAnimated?(vt(n.el,0),g(this._fadeFrame),this._fadeFrame=f(this._updateOpacity,this)):(n.active=!0,this._pruneTiles()),i||(pt(n.el,\\\"leaflet-tile-loaded\\\"),this.fire(\\\"tileload\\\",{tile:n.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire(\\\"load\\\"),Li||!this._map._fadeAnimated?f(this._pruneTiles,this):setTimeout(e(this._pruneTiles,this),250)))}},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var i=new x(this._wrapX?s(t.x,this._wrapX):t.x,this._wrapY?s(t.y,this._wrapY):t.y);return i.z=t.z,i},_pxBoundsToTileRange:function(t){var i=this.getTileSize();return new P(t.min.unscaleBy(i).floor(),t.max.unscaleBy(i).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}}),dn=_n.extend({options:{minZoom:0,maxZoom:18,subdomains:\\\"abc\\\",errorTileUrl:\\\"\\\",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1},initialize:function(t,i){this._url=t,(i=l(this,i)).detectRetina&&Ki&&i.maxZoom>0&&(i.tileSize=Math.floor(i.tileSize/2),i.zoomReverse?(i.zoomOffset--,i.minZoom++):(i.zoomOffset++,i.maxZoom--),i.minZoom=Math.max(0,i.minZoom)),\\\"string\\\"==typeof i.subdomains&&(i.subdomains=i.subdomains.split(\\\"\\\")),Ti||this.on(\\\"tileunload\\\",this._onTileRemove)},setUrl:function(t,i){return this._url=t,i||this.redraw(),this},createTile:function(t,i){var n=document.createElement(\\\"img\\\");return V(n,\\\"load\\\",e(this._tileOnLoad,this,i,n)),V(n,\\\"error\\\",e(this._tileOnError,this,i,n)),this.options.crossOrigin&&(n.crossOrigin=\\\"\\\"),n.alt=\\\"\\\",n.setAttribute(\\\"role\\\",\\\"presentation\\\"),n.src=this.getTileUrl(t),n},getTileUrl:function(t){var e={r:Ki?\\\"@2x\\\":\\\"\\\",s:this._getSubdomain(t),x:t.x,y:t.y,z:this._getZoomForUrl()};if(this._map&&!this._map.options.crs.infinite){var n=this._globalTileRange.max.y-t.y;this.options.tms&&(e.y=n),e[\\\"-y\\\"]=n}return _(this._url,i(e,this.options))},_tileOnLoad:function(t,i){Li?setTimeout(e(t,this,null,i),0):t(null,i)},_tileOnError:function(t,i,e){var n=this.options.errorTileUrl;n&&i.getAttribute(\\\"src\\\")!==n&&(i.src=n),t(e,i)},_onTileRemove:function(t){t.tile.onload=null},_getZoomForUrl:function(){var t=this._tileZoom,i=this.options.maxZoom,e=this.options.zoomReverse,n=this.options.zoomOffset;return e&&(t=i-t),t+n},_getSubdomain:function(t){var i=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[i]},_abortLoading:function(){var t,i;for(t in this._tiles)this._tiles[t].coords.z!==this._tileZoom&&((i=this._tiles[t].el).onload=r,i.onerror=r,i.complete||(i.src=ni,ut(i),delete this._tiles[t]))}}),pn=dn.extend({defaultWmsParams:{service:\\\"WMS\\\",request:\\\"GetMap\\\",layers:\\\"\\\",styles:\\\"\\\",format:\\\"image/jpeg\\\",transparent:!1,version:\\\"1.1.1\\\"},options:{crs:null,uppercase:!1},initialize:function(t,e){this._url=t;var n=i({},this.defaultWmsParams);for(var o in e)o in this.options||(n[o]=e[o]);var s=(e=l(this,e)).detectRetina&&Ki?2:1,r=this.getTileSize();n.width=r.x*s,n.height=r.y*s,this.wmsParams=n},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var i=this._wmsVersion>=1.3?\\\"crs\\\":\\\"srs\\\";this.wmsParams[i]=this._crs.code,dn.prototype.onAdd.call(this,t)},getTileUrl:function(t){var i=this._tileCoordsToNwSe(t),e=this._crs,n=b(e.project(i[0]),e.project(i[1])),o=n.min,s=n.max,r=(this._wmsVersion>=1.3&&this._crs===He?[o.y,o.x,s.y,s.x]:[o.x,o.y,s.x,s.y]).join(\\\",\\\"),a=L.TileLayer.prototype.getTileUrl.call(this,t);return a+c(this.wmsParams,a,this.options.uppercase)+(this.options.uppercase?\\\"&BBOX=\\\":\\\"&bbox=\\\")+r},setParams:function(t,e){return i(this.wmsParams,t),e||this.redraw(),this}});dn.WMS=pn,Yt.wms=function(t,i){return new pn(t,i)};var mn=Ue.extend({options:{padding:.1,tolerance:0},initialize:function(t){l(this,t),n(this),this._layers=this._layers||{}},onAdd:function(){this._container||(this._initContainer(),this._zoomAnimated&&pt(this._container,\\\"leaflet-zoom-animated\\\")),this.getPane().appendChild(this._container),this._update(),this.on(\\\"update\\\",this._updatePaths,this)},onRemove:function(){this.off(\\\"update\\\",this._updatePaths,this),this._destroyContainer()},getEvents:function(){var t={viewreset:this._reset,zoom:this._onZoom,moveend:this._update,zoomend:this._onZoomEnd};return this._zoomAnimated&&(t.zoomanim=this._onAnimZoom),t},_onAnimZoom:function(t){this._updateTransform(t.center,t.zoom)},_onZoom:function(){this._updateTransform(this._map.getCenter(),this._map.getZoom())},_updateTransform:function(t,i){var e=this._map.getZoomScale(i,this._zoom),n=Pt(this._container),o=this._map.getSize().multiplyBy(.5+this.options.padding),s=this._map.project(this._center,i),r=this._map.project(t,i).subtract(s),a=o.multiplyBy(-e).add(n).add(o).subtract(r);Ni?wt(this._container,a,e):Lt(this._container,a)},_reset:function(){this._update(),this._updateTransform(this._center,this._zoom);for(var t in this._layers)this._layers[t]._reset()},_onZoomEnd:function(){for(var t in this._layers)this._layers[t]._project()},_updatePaths:function(){for(var t in this._layers)this._layers[t]._update()},_update:function(){var t=this.options.padding,i=this._map.getSize(),e=this._map.containerPointToLayerPoint(i.multiplyBy(-t)).round();this._bounds=new P(e,e.add(i.multiplyBy(1+2*t)).round()),this._center=this._map.getCenter(),this._zoom=this._map.getZoom()}}),fn=mn.extend({getEvents:function(){var t=mn.prototype.getEvents.call(this);return t.viewprereset=this._onViewPreReset,t},_onViewPreReset:function(){this._postponeUpdatePaths=!0},onAdd:function(){mn.prototype.onAdd.call(this),this._draw()},_initContainer:function(){var t=this._container=document.createElement(\\\"canvas\\\");V(t,\\\"mousemove\\\",o(this._onMouseMove,32,this),this),V(t,\\\"click dblclick mousedown mouseup contextmenu\\\",this._onClick,this),V(t,\\\"mouseout\\\",this._handleMouseOut,this),this._ctx=t.getContext(\\\"2d\\\")},_destroyContainer:function(){delete this._ctx,ut(this._container),q(this._container),delete this._container},_updatePaths:function(){if(!this._postponeUpdatePaths){this._redrawBounds=null;for(var t in this._layers)this._layers[t]._update();this._redraw()}},_update:function(){if(!this._map._animatingZoom||!this._bounds){this._drawnLayers={},mn.prototype._update.call(this);var t=this._bounds,i=this._container,e=t.getSize(),n=Ki?2:1;Lt(i,t.min),i.width=n*e.x,i.height=n*e.y,i.style.width=e.x+\\\"px\\\",i.style.height=e.y+\\\"px\\\",Ki&&this._ctx.scale(2,2),this._ctx.translate(-t.min.x,-t.min.y),this.fire(\\\"update\\\")}},_reset:function(){mn.prototype._reset.call(this),this._postponeUpdatePaths&&(this._postponeUpdatePaths=!1,this._updatePaths())},_initPath:function(t){this._updateDashArray(t),this._layers[n(t)]=t;var i=t._order={layer:t,prev:this._drawLast,next:null};this._drawLast&&(this._drawLast.next=i),this._drawLast=i,this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(t){this._requestRedraw(t)},_removePath:function(t){var i=t._order,e=i.next,n=i.prev;e?e.prev=n:this._drawLast=n,n?n.next=e:this._drawFirst=e,delete t._order,delete this._layers[L.stamp(t)],this._requestRedraw(t)},_updatePath:function(t){this._extendRedrawBounds(t),t._project(),t._update(),this._requestRedraw(t)},_updateStyle:function(t){this._updateDashArray(t),this._requestRedraw(t)},_updateDashArray:function(t){if(t.options.dashArray){var i,e=t.options.dashArray.split(\\\",\\\"),n=[];for(i=0;i\u003Ce.length;i++)n.push(Number(e[i]));t.options._dashArray=n}},_requestRedraw:function(t){this._map&&(this._extendRedrawBounds(t),this._redrawRequest=this._redrawRequest||f(this._redraw,this))},_extendRedrawBounds:function(t){if(t._pxBounds){var i=(t.options.weight||0)+1;this._redrawBounds=this._redrawBounds||new P,this._redrawBounds.extend(t._pxBounds.min.subtract([i,i])),this._redrawBounds.extend(t._pxBounds.max.add([i,i]))}},_redraw:function(){this._redrawRequest=null,this._redrawBounds&&(this._redrawBounds.min._floor(),this._redrawBounds.max._ceil()),this._clear(),this._draw(),this._redrawBounds=null},_clear:function(){var t=this._redrawBounds;if(t){var i=t.getSize();this._ctx.clearRect(t.min.x,t.min.y,i.x,i.y)}else this._ctx.clearRect(0,0,this._container.width,this._container.height)},_draw:function(){var t,i=this._redrawBounds;if(this._ctx.save(),i){var e=i.getSize();this._ctx.beginPath(),this._ctx.rect(i.min.x,i.min.y,e.x,e.y),this._ctx.clip()}this._drawing=!0;for(var n=this._drawFirst;n;n=n.next)t=n.layer,(!i||t._pxBounds&&t._pxBounds.intersects(i))&&t._updatePath();this._drawing=!1,this._ctx.restore()},_updatePoly:function(t,i){if(this._drawing){var e,n,o,s,r=t._parts,a=r.length,h=this._ctx;if(a){for(this._drawnLayers[t._leaflet_id]=t,h.beginPath(),e=0;e\u003Ca;e++){for(n=0,o=r[e].length;n\u003Co;n++)s=r[e][n],h[n?\\\"lineTo\\\":\\\"moveTo\\\"](s.x,s.y);i&&h.closePath()}this._fillStroke(h,t)}}},_updateCircle:function(t){if(this._drawing&&!t._empty()){var i=t._point,e=this._ctx,n=Math.max(Math.round(t._radius),1),o=(Math.max(Math.round(t._radiusY),1)||n)/n;this._drawnLayers[t._leaflet_id]=t,1!==o&&(e.save(),e.scale(1,o)),e.beginPath(),e.arc(i.x,i.y/o,n,0,2*Math.PI,!1),1!==o&&e.restore(),this._fillStroke(e,t)}},_fillStroke:function(t,i){var e=i.options;e.fill&&(t.globalAlpha=e.fillOpacity,t.fillStyle=e.fillColor||e.color,t.fill(e.fillRule||\\\"evenodd\\\")),e.stroke&&0!==e.weight&&(t.setLineDash&&t.setLineDash(i.options&&i.options._dashArray||[]),t.globalAlpha=e.opacity,t.lineWidth=e.weight,t.strokeStyle=e.color,t.lineCap=e.lineCap,t.lineJoin=e.lineJoin,t.stroke())},_onClick:function(t){for(var i,e,n=this._map.mouseEventToLayerPoint(t),o=this._drawFirst;o;o=o.next)(i=o.layer).options.interactive&&i._containsPoint(n)&&!this._map._draggableMoved(i)&&(e=i);e&&(et(t),this._fireEvent([e],t))},_onMouseMove:function(t){if(this._map&&!this._map.dragging.moving()&&!this._map._animatingZoom){var i=this._map.mouseEventToLayerPoint(t);this._handleMouseHover(t,i)}},_handleMouseOut:function(t){var i=this._hoveredLayer;i&&(mt(this._container,\\\"leaflet-interactive\\\"),this._fireEvent([i],t,\\\"mouseout\\\"),this._hoveredLayer=null)},_handleMouseHover:function(t,i){for(var e,n,o=this._drawFirst;o;o=o.next)(e=o.layer).options.interactive&&e._containsPoint(i)&&(n=e);n!==this._hoveredLayer&&(this._handleMouseOut(t),n&&(pt(this._container,\\\"leaflet-interactive\\\"),this._fireEvent([n],t,\\\"mouseover\\\"),this._hoveredLayer=n)),this._hoveredLayer&&this._fireEvent([this._hoveredLayer],t)},_fireEvent:function(t,i,e){this._map._fireDOMEvent(i,e||i.type,t)},_bringToFront:function(t){var i=t._order,e=i.next,n=i.prev;e&&(e.prev=n,n?n.next=e:e&&(this._drawFirst=e),i.prev=this._drawLast,this._drawLast.next=i,i.next=null,this._drawLast=i,this._requestRedraw(t))},_bringToBack:function(t){var i=t._order,e=i.next,n=i.prev;n&&(n.next=e,e?e.prev=n:n&&(this._drawLast=n),i.prev=null,i.next=this._drawFirst,this._drawFirst.prev=i,this._drawFirst=i,this._requestRedraw(t))}}),gn=function(){try{return document.namespaces.add(\\\"lvml\\\",\\\"urn:schemas-microsoft-com:vml\\\"),function(t){return document.createElement(\\\"\u003Clvml:\\\"+t+' class=\\\"lvml\\\">')}}catch(t){return function(t){return document.createElement(\\\"\u003C\\\"+t+' xmlns=\\\"urn:schemas-microsoft.com:vml\\\" class=\\\"lvml\\\">')}}}(),vn={_initContainer:function(){this._container=ht(\\\"div\\\",\\\"leaflet-vml-container\\\")},_update:function(){this._map._animatingZoom||(mn.prototype._update.call(this),this.fire(\\\"update\\\"))},_initPath:function(t){var i=t._container=gn(\\\"shape\\\");pt(i,\\\"leaflet-vml-shape \\\"+(this.options.className||\\\"\\\")),i.coordsize=\\\"1 1\\\",t._path=gn(\\\"path\\\"),i.appendChild(t._path),this._updateStyle(t),this._layers[n(t)]=t},_addPath:function(t){var i=t._container;this._container.appendChild(i),t.options.interactive&&t.addInteractiveTarget(i)},_removePath:function(t){var i=t._container;ut(i),t.removeInteractiveTarget(i),delete this._layers[n(t)]},_updateStyle:function(t){var i=t._stroke,e=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(i||(i=t._stroke=gn(\\\"stroke\\\")),o.appendChild(i),i.weight=n.weight+\\\"px\\\",i.color=n.color,i.opacity=n.opacity,n.dashArray?i.dashStyle=ei(n.dashArray)?n.dashArray.join(\\\" \\\"):n.dashArray.replace(/( *, *)/g,\\\" \\\"):i.dashStyle=\\\"\\\",i.endcap=n.lineCap.replace(\\\"butt\\\",\\\"flat\\\"),i.joinstyle=n.lineJoin):i&&(o.removeChild(i),t._stroke=null),n.fill?(e||(e=t._fill=gn(\\\"fill\\\")),o.appendChild(e),e.color=n.fillColor||n.color,e.opacity=n.fillOpacity):e&&(o.removeChild(e),t._fill=null)},_updateCircle:function(t){var i=t._point.round(),e=Math.round(t._radius),n=Math.round(t._radiusY||e);this._setPath(t,t._empty()?\\\"M0 0\\\":\\\"AL \\\"+i.x+\\\",\\\"+i.y+\\\" \\\"+e+\\\",\\\"+n+\\\" 0,23592600\\\")},_setPath:function(t,i){t._path.v=i},_bringToFront:function(t){ct(t._container)},_bringToBack:function(t){_t(t._container)}},yn=Ji?gn:E,xn=mn.extend({getEvents:function(){var t=mn.prototype.getEvents.call(this);return t.zoomstart=this._onZoomStart,t},_initContainer:function(){this._container=yn(\\\"svg\\\"),this._container.setAttribute(\\\"pointer-events\\\",\\\"none\\\"),this._rootGroup=yn(\\\"g\\\"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){ut(this._container),q(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_onZoomStart:function(){this._update()},_update:function(){if(!this._map._animatingZoom||!this._bounds){mn.prototype._update.call(this);var t=this._bounds,i=t.getSize(),e=this._container;this._svgSize&&this._svgSize.equals(i)||(this._svgSize=i,e.setAttribute(\\\"width\\\",i.x),e.setAttribute(\\\"height\\\",i.y)),Lt(e,t.min),e.setAttribute(\\\"viewBox\\\",[t.min.x,t.min.y,i.x,i.y].join(\\\" \\\")),this.fire(\\\"update\\\")}},_initPath:function(t){var i=t._path=yn(\\\"path\\\");t.options.className&&pt(i,t.options.className),t.options.interactive&&pt(i,\\\"leaflet-interactive\\\"),this._updateStyle(t),this._layers[n(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){ut(t._path),t.removeInteractiveTarget(t._path),delete this._layers[n(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var i=t._path,e=t.options;i&&(e.stroke?(i.setAttribute(\\\"stroke\\\",e.color),i.setAttribute(\\\"stroke-opacity\\\",e.opacity),i.setAttribute(\\\"stroke-width\\\",e.weight),i.setAttribute(\\\"stroke-linecap\\\",e.lineCap),i.setAttribute(\\\"stroke-linejoin\\\",e.lineJoin),e.dashArray?i.setAttribute(\\\"stroke-dasharray\\\",e.dashArray):i.removeAttribute(\\\"stroke-dasharray\\\"),e.dashOffset?i.setAttribute(\\\"stroke-dashoffset\\\",e.dashOffset):i.removeAttribute(\\\"stroke-dashoffset\\\")):i.setAttribute(\\\"stroke\\\",\\\"none\\\"),e.fill?(i.setAttribute(\\\"fill\\\",e.fillColor||e.color),i.setAttribute(\\\"fill-opacity\\\",e.fillOpacity),i.setAttribute(\\\"fill-rule\\\",e.fillRule||\\\"evenodd\\\")):i.setAttribute(\\\"fill\\\",\\\"none\\\"))},_updatePoly:function(t,i){this._setPath(t,k(t._parts,i))},_updateCircle:function(t){var i=t._point,e=Math.max(Math.round(t._radius),1),n=\\\"a\\\"+e+\\\",\\\"+(Math.max(Math.round(t._radiusY),1)||e)+\\\" 0 1,0 \\\",o=t._empty()?\\\"M0 0\\\":\\\"M\\\"+(i.x-e)+\\\",\\\"+i.y+n+2*e+\\\",0 \\\"+n+2*-e+\\\",0 \\\";this._setPath(t,o)},_setPath:function(t,i){t._path.setAttribute(\\\"d\\\",i)},_bringToFront:function(t){ct(t._path)},_bringToBack:function(t){_t(t._path)}});Ji&&xn.include(vn),Le.include({getRenderer:function(t){var i=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer;return i||(i=this._renderer=this.options.preferCanvas&&Xt()||Jt()),this.hasLayer(i)||this.addLayer(i),i},_getPaneRenderer:function(t){if(\\\"overlayPane\\\"===t||void 0===t)return!1;var i=this._paneRenderers[t];return void 0===i&&(i=xn&&Jt({pane:t})||fn&&Xt({pane:t}),this._paneRenderers[t]=i),i}});var wn=en.extend({initialize:function(t,i){en.prototype.initialize.call(this,this._boundsToLatLngs(t),i)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=z(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});xn.create=yn,xn.pointsToPath=k,nn.geometryToLayer=Wt,nn.coordsToLatLng=Ht,nn.coordsToLatLngs=Ft,nn.latLngToCoords=Ut,nn.latLngsToCoords=Vt,nn.getFeature=qt,nn.asFeature=Gt,Le.mergeOptions({boxZoom:!0});var Ln=Ze.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on(\\\"unload\\\",this._destroy,this)},addHooks:function(){V(this._container,\\\"mousedown\\\",this._onMouseDown,this)},removeHooks:function(){q(this._container,\\\"mousedown\\\",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){ut(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),mi(),bt(),this._startPoint=this._map.mouseEventToContainerPoint(t),V(document,{contextmenu:Q,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=ht(\\\"div\\\",\\\"leaflet-zoom-box\\\",this._container),pt(this._container,\\\"leaflet-crosshair\\\"),this._map.fire(\\\"boxzoomstart\\\")),this._point=this._map.mouseEventToContainerPoint(t);var i=new P(this._point,this._startPoint),e=i.getSize();Lt(this._box,i.min),this._box.style.width=e.x+\\\"px\\\",this._box.style.height=e.y+\\\"px\\\"},_finish:function(){this._moved&&(ut(this._box),mt(this._container,\\\"leaflet-crosshair\\\")),fi(),Tt(),q(document,{contextmenu:Q,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(e(this._resetState,this),0);var i=new T(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(i).fire(\\\"boxzoomend\\\",{boxZoomBounds:i})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}});Le.addInitHook(\\\"addHandler\\\",\\\"boxZoom\\\",Ln),Le.mergeOptions({doubleClickZoom:!0});var Pn=Ze.extend({addHooks:function(){this._map.on(\\\"dblclick\\\",this._onDoubleClick,this)},removeHooks:function(){this._map.off(\\\"dblclick\\\",this._onDoubleClick,this)},_onDoubleClick:function(t){var i=this._map,e=i.getZoom(),n=i.options.zoomDelta,o=t.originalEvent.shiftKey?e-n:e+n;\\\"center\\\"===i.options.doubleClickZoom?i.setZoom(o):i.setZoomAround(t.containerPoint,o)}});Le.addInitHook(\\\"addHandler\\\",\\\"doubleClickZoom\\\",Pn),Le.mergeOptions({dragging:!0,inertia:!zi,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});var bn=Ze.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new Be(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on(\\\"predrag\\\",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on(\\\"predrag\\\",this._onPreDragWrap,this),t.on(\\\"zoomend\\\",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))}pt(this._map._container,\\\"leaflet-grab leaflet-touch-drag\\\"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){mt(this._map._container,\\\"leaflet-grab\\\"),mt(this._map._container,\\\"leaflet-touch-drag\\\"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t=this._map;if(t._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity){var i=z(this._map.options.maxBounds);this._offsetLimit=b(this._map.latLngToContainerPoint(i.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(i.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))}else this._offsetLimit=null;t.fire(\\\"movestart\\\").fire(\\\"dragstart\\\"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){if(this._map.options.inertia){var i=this._lastTime=+new Date,e=this._lastPos=this._draggable._absPos||this._draggable._newPos;this._positions.push(e),this._times.push(i),this._prunePositions(i)}this._map.fire(\\\"move\\\",t).fire(\\\"drag\\\",t)},_prunePositions:function(t){for(;this._positions.length>1&&t-this._times[0]>50;)this._positions.shift(),this._times.shift()},_onZoomEnd:function(){var t=this._map.getSize().divideBy(2),i=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=i.subtract(t).x,this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(t,i){return t-(t-i)*this._viscosity},_onPreDragLimit:function(){if(this._viscosity&&this._offsetLimit){var t=this._draggable._newPos.subtract(this._draggable._startPos),i=this._offsetLimit;t.x\u003Ci.min.x&&(t.x=this._viscousLimit(t.x,i.min.x)),t.y\u003Ci.min.y&&(t.y=this._viscousLimit(t.y,i.min.y)),t.x>i.max.x&&(t.x=this._viscousLimit(t.x,i.max.x)),t.y>i.max.y&&(t.y=this._viscousLimit(t.y,i.max.y)),this._draggable._newPos=this._draggable._startPos.add(t)}},_onPreDragWrap:function(){var t=this._worldWidth,i=Math.round(t/2),e=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-i+e)%t+i-e,s=(n+i+e)%t-i-e,r=Math.abs(o+e)\u003CMath.abs(s+e)?o:s;this._draggable._absPos=this._draggable._newPos.clone(),this._draggable._newPos.x=r},_onDragEnd:function(t){var i=this._map,e=i.options,n=!e.inertia||this._times.length\u003C2;if(i.fire(\\\"dragend\\\",t),n)i.fire(\\\"moveend\\\");else{this._prunePositions(+new Date);var o=this._lastPos.subtract(this._positions[0]),s=(this._lastTime-this._times[0])/1e3,r=e.easeLinearity,a=o.multiplyBy(r/s),h=a.distanceTo([0,0]),u=Math.min(e.inertiaMaxSpeed,h),l=a.multiplyBy(u/h),c=u/(e.inertiaDeceleration*r),_=l.multiplyBy(-c/2).round();_.x||_.y?(_=i._limitOffset(_,i.options.maxBounds),f(function(){i.panBy(_,{duration:c,easeLinearity:r,noMoveStart:!0,animate:!0})})):i.fire(\\\"moveend\\\")}}});Le.addInitHook(\\\"addHandler\\\",\\\"dragging\\\",bn),Le.mergeOptions({keyboard:!0,keyboardPanDelta:80});var Tn=Ze.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,54,173]},initialize:function(t){this._map=t,this._setPanDelta(t.options.keyboardPanDelta),this._setZoomDelta(t.options.zoomDelta)},addHooks:function(){var t=this._map._container;t.tabIndex\u003C=0&&(t.tabIndex=\\\"0\\\"),V(t,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.on({focus:this._addHooks,blur:this._removeHooks},this)},removeHooks:function(){this._removeHooks(),q(this._map._container,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.off({focus:this._addHooks,blur:this._removeHooks},this)},_onMouseDown:function(){if(!this._focused){var t=document.body,i=document.documentElement,e=t.scrollTop||i.scrollTop,n=t.scrollLeft||i.scrollLeft;this._map._container.focus(),window.scrollTo(n,e)}},_onFocus:function(){this._focused=!0,this._map.fire(\\\"focus\\\")},_onBlur:function(){this._focused=!1,this._map.fire(\\\"blur\\\")},_setPanDelta:function(t){var i,e,n=this._panKeys={},o=this.keyCodes;for(i=0,e=o.left.length;i\u003Ce;i++)n[o.left[i]]=[-1*t,0];for(i=0,e=o.right.length;i\u003Ce;i++)n[o.right[i]]=[t,0];for(i=0,e=o.down.length;i\u003Ce;i++)n[o.down[i]]=[0,t];for(i=0,e=o.up.length;i\u003Ce;i++)n[o.up[i]]=[0,-1*t]},_setZoomDelta:function(t){var i,e,n=this._zoomKeys={},o=this.keyCodes;for(i=0,e=o.zoomIn.length;i\u003Ce;i++)n[o.zoomIn[i]]=t;for(i=0,e=o.zoomOut.length;i\u003Ce;i++)n[o.zoomOut[i]]=-t},_addHooks:function(){V(document,\\\"keydown\\\",this._onKeyDown,this)},_removeHooks:function(){q(document,\\\"keydown\\\",this._onKeyDown,this)},_onKeyDown:function(t){if(!(t.altKey||t.ctrlKey||t.metaKey)){var i,e=t.keyCode,n=this._map;if(e in this._panKeys){if(n._panAnim&&n._panAnim._inProgress)return;i=this._panKeys[e],t.shiftKey&&(i=w(i).multiplyBy(3)),n.panBy(i),n.options.maxBounds&&n.panInsideBounds(n.options.maxBounds)}else if(e in this._zoomKeys)n.setZoom(n.getZoom()+(t.shiftKey?3:1)*this._zoomKeys[e]);else{if(27!==e||!n._popup||!n._popup.options.closeOnEscapeKey)return;n.closePopup()}Q(t)}}});Le.addInitHook(\\\"addHandler\\\",\\\"keyboard\\\",Tn),Le.mergeOptions({scrollWheelZoom:!0,wheelDebounceTime:40,wheelPxPerZoomLevel:60});var zn=Ze.extend({addHooks:function(){V(this._map._container,\\\"mousewheel\\\",this._onWheelScroll,this),this._delta=0},removeHooks:function(){q(this._map._container,\\\"mousewheel\\\",this._onWheelScroll,this)},_onWheelScroll:function(t){var i=it(t),n=this._map.options.wheelDebounceTime;this._delta+=i,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var o=Math.max(n-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(e(this._performZoom,this),o),Q(t)},_performZoom:function(){var t=this._map,i=t.getZoom(),e=this._map.options.zoomSnap||0;t._stop();var n=this._delta/(4*this._map.options.wheelPxPerZoomLevel),o=4*Math.log(2/(1+Math.exp(-Math.abs(n))))/Math.LN2,s=e?Math.ceil(o/e)*e:o,r=t._limitZoom(i+(this._delta>0?s:-s))-i;this._delta=0,this._startTime=null,r&&(\\\"center\\\"===t.options.scrollWheelZoom?t.setZoom(i+r):t.setZoomAround(this._lastMousePos,i+r))}});Le.addInitHook(\\\"addHandler\\\",\\\"scrollWheelZoom\\\",zn),Le.mergeOptions({tap:!0,tapTolerance:15});var Mn=Ze.extend({addHooks:function(){V(this._map._container,\\\"touchstart\\\",this._onDown,this)},removeHooks:function(){q(this._map._container,\\\"touchstart\\\",this._onDown,this)},_onDown:function(t){if(t.touches){if($(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var i=t.touches[0],n=i.target;this._startPos=this._newPos=new x(i.clientX,i.clientY),n.tagName&&\\\"a\\\"===n.tagName.toLowerCase()&&pt(n,\\\"leaflet-active\\\"),this._holdTimeout=setTimeout(e(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent(\\\"contextmenu\\\",i))},this),1e3),this._simulateEvent(\\\"mousedown\\\",i),V(document,{touchmove:this._onMove,touchend:this._onUp},this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),q(document,{touchmove:this._onMove,touchend:this._onUp},this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],e=i.target;e&&e.tagName&&\\\"a\\\"===e.tagName.toLowerCase()&&mt(e,\\\"leaflet-active\\\"),this._simulateEvent(\\\"mouseup\\\",i),this._isTapValid()&&this._simulateEvent(\\\"click\\\",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)\u003C=this._map.options.tapTolerance},_onMove:function(t){var i=t.touches[0];this._newPos=new x(i.clientX,i.clientY),this._simulateEvent(\\\"mousemove\\\",i)},_simulateEvent:function(t,i){var e=document.createEvent(\\\"MouseEvents\\\");e._simulated=!0,i.target._simulatedClick=!0,e.initMouseEvent(t,!0,!0,window,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),i.target.dispatchEvent(e)}});Vi&&!Ui&&Le.addInitHook(\\\"addHandler\\\",\\\"tap\\\",Mn),Le.mergeOptions({touchZoom:Vi&&!zi,bounceAtZoomLimits:!0});var Cn=Ze.extend({addHooks:function(){pt(this._map._container,\\\"leaflet-touch-zoom\\\"),V(this._map._container,\\\"touchstart\\\",this._onTouchStart,this)},removeHooks:function(){mt(this._map._container,\\\"leaflet-touch-zoom\\\"),q(this._map._container,\\\"touchstart\\\",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var e=i.mouseEventToContainerPoint(t.touches[0]),n=i.mouseEventToContainerPoint(t.touches[1]);this._centerPoint=i.getSize()._divideBy(2),this._startLatLng=i.containerPointToLatLng(this._centerPoint),\\\"center\\\"!==i.options.touchZoom&&(this._pinchStartLatLng=i.containerPointToLatLng(e.add(n)._divideBy(2))),this._startDist=e.distanceTo(n),this._startZoom=i.getZoom(),this._moved=!1,this._zooming=!0,i._stop(),V(document,\\\"touchmove\\\",this._onTouchMove,this),V(document,\\\"touchend\\\",this._onTouchEnd,this),$(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length&&this._zooming){var i=this._map,n=i.mouseEventToContainerPoint(t.touches[0]),o=i.mouseEventToContainerPoint(t.touches[1]),s=n.distanceTo(o)/this._startDist;if(this._zoom=i.getScaleZoom(s,this._startZoom),!i.options.bounceAtZoomLimits&&(this._zoom\u003Ci.getMinZoom()&&s\u003C1||this._zoom>i.getMaxZoom()&&s>1)&&(this._zoom=i._limitZoom(this._zoom)),\\\"center\\\"===i.options.touchZoom){if(this._center=this._startLatLng,1===s)return}else{var r=n._add(o)._divideBy(2)._subtract(this._centerPoint);if(1===s&&0===r.x&&0===r.y)return;this._center=i.unproject(i.project(this._pinchStartLatLng,this._zoom).subtract(r),this._zoom)}this._moved||(i._moveStart(!0,!1),this._moved=!0),g(this._animRequest);var a=e(i._move,i,this._center,this._zoom,{pinch:!0,round:!1});this._animRequest=f(a,this,!0),$(t)}},_onTouchEnd:function(){this._moved&&this._zooming?(this._zooming=!1,g(this._animRequest),q(document,\\\"touchmove\\\",this._onTouchMove),q(document,\\\"touchend\\\",this._onTouchEnd),this._map.options.zoomAnimation?this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),!0,this._map.options.zoomSnap):this._map._resetView(this._center,this._map._limitZoom(this._zoom))):this._zooming=!1}});Le.addInitHook(\\\"addHandler\\\",\\\"touchZoom\\\",Cn),Le.BoxZoom=Ln,Le.DoubleClickZoom=Pn,Le.Drag=bn,Le.Keyboard=Tn,Le.ScrollWheelZoom=zn,Le.Tap=Mn,Le.TouchZoom=Cn;var Zn=window.L;window.L=t,Object.freeze=$t,t.version=\\\"1.3.1\\\",t.noConflict=function(){return window.L=Zn,this},t.Control=Pe,t.control=be,t.Browser=$i,t.Evented=ui,t.Mixin=Ee,t.Util=ai,t.Class=v,t.Handler=Ze,t.extend=i,t.bind=e,t.stamp=n,t.setOptions=l,t.DomEvent=de,t.DomUtil=xe,t.PosAnimation=we,t.Draggable=Be,t.LineUtil=Oe,t.PolyUtil=Re,t.Point=x,t.point=w,t.Bounds=P,t.bounds=b,t.Transformation=Z,t.transformation=S,t.Projection=je,t.LatLng=M,t.latLng=C,t.LatLngBounds=T,t.latLngBounds=z,t.CRS=ci,t.GeoJSON=nn,t.geoJSON=Kt,t.geoJson=sn,t.Layer=Ue,t.LayerGroup=Ve,t.layerGroup=function(t,i){return new Ve(t,i)},t.FeatureGroup=qe,t.featureGroup=function(t){return new qe(t)},t.ImageOverlay=rn,t.imageOverlay=function(t,i,e){return new rn(t,i,e)},t.VideoOverlay=an,t.videoOverlay=function(t,i,e){return new an(t,i,e)},t.DivOverlay=hn,t.Popup=un,t.popup=function(t,i){return new un(t,i)},t.Tooltip=ln,t.tooltip=function(t,i){return new ln(t,i)},t.Icon=Ge,t.icon=function(t){return new Ge(t)},t.DivIcon=cn,t.divIcon=function(t){return new cn(t)},t.Marker=Xe,t.marker=function(t,i){return new Xe(t,i)},t.TileLayer=dn,t.tileLayer=Yt,t.GridLayer=_n,t.gridLayer=function(t){return new _n(t)},t.SVG=xn,t.svg=Jt,t.Renderer=mn,t.Canvas=fn,t.canvas=Xt,t.Path=Je,t.CircleMarker=$e,t.circleMarker=function(t,i){return new $e(t,i)},t.Circle=Qe,t.circle=function(t,i,e){return new Qe(t,i,e)},t.Polyline=tn,t.polyline=function(t,i){return new tn(t,i)},t.Polygon=en,t.polygon=function(t,i){return new en(t,i)},t.Rectangle=wn,t.rectangle=function(t,i){return new wn(t,i)},t.Map=Le,t.map=function(t,i){return new Le(t,i)}});\\n}\\nexports.L = L;\\n\",\n \"type\": \"application/javascript\",\n \"title\": \"$:/plugins/sycom/leaflet/lib/leaflet.js\",\n \"module-type\": \"library\"\n },\n \"$:/plugins/sycom/leaflet/lib/leaflet-markercluster.js\": {\n \"text\": \"if($tw.browser){\\n!function(e,t){\\\"object\\\"==typeof exports&&\\\"undefined\\\"!=typeof module?t(exports):\\\"function\\\"==typeof define&&define.amd?define([\\\"exports\\\"],t):t((e.Leaflet=e.Leaflet||{},e.Leaflet.markercluster=e.Leaflet.markercluster||{}))}(this,function(e){\\\"use strict\\\";var t=L.MarkerClusterGroup=L.FeatureGroup.extend({options:{maxClusterRadius:80,iconCreateFunction:null,clusterPane:L.Marker.prototype.options.pane,spiderfyOnMaxZoom:!0,showCoverageOnHover:!0,zoomToBoundsOnClick:!0,singleMarkerMode:!1,disableClusteringAtZoom:null,removeOutsideVisibleBounds:!0,animate:!0,animateAddingMarkers:!1,spiderfyDistanceMultiplier:1,spiderLegPolylineOptions:{weight:1.5,color:\\\"#222\\\",opacity:.5},chunkedLoading:!1,chunkInterval:200,chunkDelay:50,chunkProgress:null,polygonOptions:{}},initialize:function(e){L.Util.setOptions(this,e),this.options.iconCreateFunction||(this.options.iconCreateFunction=this._defaultIconCreateFunction),this._featureGroup=L.featureGroup(),this._featureGroup.addEventParent(this),this._nonPointGroup=L.featureGroup(),this._nonPointGroup.addEventParent(this),this._inZoomAnimation=0,this._needsClustering=[],this._needsRemoving=[],this._currentShownBounds=null,this._queue=[],this._childMarkerEventHandlers={dragstart:this._childMarkerDragStart,move:this._childMarkerMoved,dragend:this._childMarkerDragEnd};var t=L.DomUtil.TRANSITION&&this.options.animate;L.extend(this,t?this._withAnimation:this._noAnimation),this._markerCluster=t?L.MarkerCluster:L.MarkerClusterNonAnimated},addLayer:function(e){if(e instanceof L.LayerGroup)return this.addLayers([e]);if(!e.getLatLng)return this._nonPointGroup.addLayer(e),this.fire(\\\"layeradd\\\",{layer:e}),this;if(!this._map)return this._needsClustering.push(e),this.fire(\\\"layeradd\\\",{layer:e}),this;if(this.hasLayer(e))return this;this._unspiderfy&&this._unspiderfy(),this._addLayer(e,this._maxZoom),this.fire(\\\"layeradd\\\",{layer:e}),this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons();var t=e,i=this._zoom;if(e.__parent)for(;t.__parent._zoom>=i;)t=t.__parent;return this._currentShownBounds.contains(t.getLatLng())&&(this.options.animateAddingMarkers?this._animationAddLayer(e,t):this._animationAddLayerNonAnimated(e,t)),this},removeLayer:function(e){return e instanceof L.LayerGroup?this.removeLayers([e]):e.getLatLng?this._map?e.__parent?(this._unspiderfy&&(this._unspiderfy(),this._unspiderfyLayer(e)),this._removeLayer(e,!0),this.fire(\\\"layerremove\\\",{layer:e}),this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),e.off(this._childMarkerEventHandlers,this),this._featureGroup.hasLayer(e)&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow()),this):this:(!this._arraySplice(this._needsClustering,e)&&this.hasLayer(e)&&this._needsRemoving.push({layer:e,latlng:e._latlng}),this.fire(\\\"layerremove\\\",{layer:e}),this):(this._nonPointGroup.removeLayer(e),this.fire(\\\"layerremove\\\",{layer:e}),this)},addLayers:function(e,t){if(!L.Util.isArray(e))return this.addLayer(e);var i,n=this._featureGroup,r=this._nonPointGroup,s=this.options.chunkedLoading,o=this.options.chunkInterval,a=this.options.chunkProgress,h=e.length,l=0,u=!0;if(this._map){var _=(new Date).getTime(),d=L.bind(function(){for(var c=(new Date).getTime();h>l;l++){if(s&&0===l%200){var p=(new Date).getTime()-c;if(p>o)break}if(i=e[l],i instanceof L.LayerGroup)u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(i,e),h=e.length;else if(i.getLatLng){if(!this.hasLayer(i)&&(this._addLayer(i,this._maxZoom),t||this.fire(\\\"layeradd\\\",{layer:i}),i.__parent&&2===i.__parent.getChildCount())){var f=i.__parent.getAllChildMarkers(),m=f[0]===i?f[1]:f[0];n.removeLayer(m)}}else r.addLayer(i),t||this.fire(\\\"layeradd\\\",{layer:i})}a&&a(l,h,(new Date).getTime()-_),l===h?(this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds)):setTimeout(d,this.options.chunkDelay)},this);d()}else for(var c=this._needsClustering;h>l;l++)i=e[l],i instanceof L.LayerGroup?(u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(i,e),h=e.length):i.getLatLng?this.hasLayer(i)||c.push(i):r.addLayer(i);return this},removeLayers:function(e){var t,i,n=e.length,r=this._featureGroup,s=this._nonPointGroup,o=!0;if(!this._map){for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):(this._arraySplice(this._needsClustering,i),s.removeLayer(i),this.hasLayer(i)&&this._needsRemoving.push({layer:i,latlng:i._latlng}),this.fire(\\\"layerremove\\\",{layer:i}));return this}if(this._unspiderfy){this._unspiderfy();var a=e.slice(),h=n;for(t=0;h>t;t++)i=a[t],i instanceof L.LayerGroup?(this._extractNonGroupLayers(i,a),h=a.length):this._unspiderfyLayer(i)}for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):i.__parent?(this._removeLayer(i,!0,!0),this.fire(\\\"layerremove\\\",{layer:i}),r.hasLayer(i)&&(r.removeLayer(i),i.clusterShow&&i.clusterShow())):(s.removeLayer(i),this.fire(\\\"layerremove\\\",{layer:i}));return this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds),this},clearLayers:function(){return this._map||(this._needsClustering=[],delete this._gridClusters,delete this._gridUnclustered),this._noanimationUnspiderfy&&this._noanimationUnspiderfy(),this._featureGroup.clearLayers(),this._nonPointGroup.clearLayers(),this.eachLayer(function(e){e.off(this._childMarkerEventHandlers,this),delete e.__parent},this),this._map&&this._generateInitialClusters(),this},getBounds:function(){var e=new L.LatLngBounds;this._topClusterLevel&&e.extend(this._topClusterLevel._bounds);for(var t=this._needsClustering.length-1;t>=0;t--)e.extend(this._needsClustering[t].getLatLng());return e.extend(this._nonPointGroup.getBounds()),e},eachLayer:function(e,t){var i,n,r,s=this._needsClustering.slice(),o=this._needsRemoving;for(this._topClusterLevel&&this._topClusterLevel.getAllChildMarkers(s),n=s.length-1;n>=0;n--){for(i=!0,r=o.length-1;r>=0;r--)if(o[r].layer===s[n]){i=!1;break}i&&e.call(t,s[n])}this._nonPointGroup.eachLayer(e,t)},getLayers:function(){var e=[];return this.eachLayer(function(t){e.push(t)}),e},getLayer:function(e){var t=null;return e=parseInt(e,10),this.eachLayer(function(i){L.stamp(i)===e&&(t=i)}),t},hasLayer:function(e){if(!e)return!1;var t,i=this._needsClustering;for(t=i.length-1;t>=0;t--)if(i[t]===e)return!0;for(i=this._needsRemoving,t=i.length-1;t>=0;t--)if(i[t].layer===e)return!1;return!(!e.__parent||e.__parent._group!==this)||this._nonPointGroup.hasLayer(e)},zoomToShowLayer:function(e,t){\\\"function\\\"!=typeof t&&(t=function(){});var i=function(){!e._icon&&!e.__parent._icon||this._inZoomAnimation||(this._map.off(\\\"moveend\\\",i,this),this.off(\\\"animationend\\\",i,this),e._icon?t():e.__parent._icon&&(this.once(\\\"spiderfied\\\",t,this),e.__parent.spiderfy()))};e._icon&&this._map.getBounds().contains(e.getLatLng())?t():e.__parent._zoom\u003CMath.round(this._map._zoom)?(this._map.on(\\\"moveend\\\",i,this),this._map.panTo(e.getLatLng())):(this._map.on(\\\"moveend\\\",i,this),this.on(\\\"animationend\\\",i,this),e.__parent.zoomToBounds())},onAdd:function(e){this._map=e;var t,i,n;if(!isFinite(this._map.getMaxZoom()))throw\\\"Map has no maxZoom specified\\\";for(this._featureGroup.addTo(e),this._nonPointGroup.addTo(e),this._gridClusters||this._generateInitialClusters(),this._maxLat=e.options.crs.projection.MAX_LATITUDE,t=0,i=this._needsRemoving.length;i>t;t++)n=this._needsRemoving[t],n.newlatlng=n.layer._latlng,n.layer._latlng=n.latlng;for(t=0,i=this._needsRemoving.length;i>t;t++)n=this._needsRemoving[t],this._removeLayer(n.layer,!0),n.layer._latlng=n.newlatlng;this._needsRemoving=[],this._zoom=Math.round(this._map._zoom),this._currentShownBounds=this._getExpandedVisibleBounds(),this._map.on(\\\"zoomend\\\",this._zoomEnd,this),this._map.on(\\\"moveend\\\",this._moveEnd,this),this._spiderfierOnAdd&&this._spiderfierOnAdd(),this._bindEvents(),i=this._needsClustering,this._needsClustering=[],this.addLayers(i,!0)},onRemove:function(e){e.off(\\\"zoomend\\\",this._zoomEnd,this),e.off(\\\"moveend\\\",this._moveEnd,this),this._unbindEvents(),this._map._mapPane.className=this._map._mapPane.className.replace(\\\" leaflet-cluster-anim\\\",\\\"\\\"),this._spiderfierOnRemove&&this._spiderfierOnRemove(),delete this._maxLat,this._hideCoverage(),this._featureGroup.remove(),this._nonPointGroup.remove(),this._featureGroup.clearLayers(),this._map=null},getVisibleParent:function(e){for(var t=e;t&&!t._icon;)t=t.__parent;return t||null},_arraySplice:function(e,t){for(var i=e.length-1;i>=0;i--)if(e[i]===t)return e.splice(i,1),!0},_removeFromGridUnclustered:function(e,t){for(var i=this._map,n=this._gridUnclustered,r=Math.floor(this._map.getMinZoom());t>=r&&n[t].removeObject(e,i.project(e.getLatLng(),t));t--);},_childMarkerDragStart:function(e){e.target.__dragStart=e.target._latlng},_childMarkerMoved:function(e){if(!this._ignoreMove&&!e.target.__dragStart){var t=e.target._popup&&e.target._popup.isOpen();this._moveChild(e.target,e.oldLatLng,e.latlng),t&&e.target.openPopup()}},_moveChild:function(e,t,i){e._latlng=t,this.removeLayer(e),e._latlng=i,this.addLayer(e)},_childMarkerDragEnd:function(e){e.target.__dragStart&&this._moveChild(e.target,e.target.__dragStart,e.target._latlng),delete e.target.__dragStart},_removeLayer:function(e,t,i){var n=this._gridClusters,r=this._gridUnclustered,s=this._featureGroup,o=this._map,a=Math.floor(this._map.getMinZoom());t&&this._removeFromGridUnclustered(e,this._maxZoom);var h,l=e.__parent,u=l._markers;for(this._arraySplice(u,e);l&&(l._childCount--,l._boundsNeedUpdate=!0,!(l._zoom\u003Ca));)t&&l._childCount\u003C=1?(h=l._markers[0]===e?l._markers[1]:l._markers[0],n[l._zoom].removeObject(l,o.project(l._cLatLng,l._zoom)),r[l._zoom].addObject(h,o.project(h.getLatLng(),l._zoom)),this._arraySplice(l.__parent._childClusters,l),l.__parent._markers.push(h),h.__parent=l.__parent,l._icon&&(s.removeLayer(l),i||s.addLayer(h))):l._iconNeedsUpdate=!0,l=l.__parent;delete e.__parent},_isOrIsParent:function(e,t){for(;t;){if(e===t)return!0;t=t.parentNode}return!1},fire:function(e,t,i){if(t&&t.layer instanceof L.MarkerCluster){if(t.originalEvent&&this._isOrIsParent(t.layer._icon,t.originalEvent.relatedTarget))return;e=\\\"cluster\\\"+e}L.FeatureGroup.prototype.fire.call(this,e,t,i)},listens:function(e,t){return L.FeatureGroup.prototype.listens.call(this,e,t)||L.FeatureGroup.prototype.listens.call(this,\\\"cluster\\\"+e,t)},_defaultIconCreateFunction:function(e){var t=e.getChildCount(),i=\\\" marker-cluster-\\\";return i+=10>t?\\\"small\\\":100>t?\\\"medium\\\":\\\"large\\\",new L.DivIcon({html:\\\"\u003Cdiv>\u003Cspan>\\\"+t+\\\"\u003C/span>\u003C/div>\\\",className:\\\"marker-cluster\\\"+i,iconSize:new L.Point(40,40)})},_bindEvents:function(){var e=this._map,t=this.options.spiderfyOnMaxZoom,i=this.options.showCoverageOnHover,n=this.options.zoomToBoundsOnClick;(t||n)&&this.on(\\\"clusterclick\\\",this._zoomOrSpiderfy,this),i&&(this.on(\\\"clustermouseover\\\",this._showCoverage,this),this.on(\\\"clustermouseout\\\",this._hideCoverage,this),e.on(\\\"zoomend\\\",this._hideCoverage,this))},_zoomOrSpiderfy:function(e){for(var t=e.layer,i=t;1===i._childClusters.length;)i=i._childClusters[0];i._zoom===this._maxZoom&&i._childCount===t._childCount&&this.options.spiderfyOnMaxZoom?t.spiderfy():this.options.zoomToBoundsOnClick&&t.zoomToBounds(),e.originalEvent&&13===e.originalEvent.keyCode&&this._map._container.focus()},_showCoverage:function(e){var t=this._map;this._inZoomAnimation||(this._shownPolygon&&t.removeLayer(this._shownPolygon),e.layer.getChildCount()>2&&e.layer!==this._spiderfied&&(this._shownPolygon=new L.Polygon(e.layer.getConvexHull(),this.options.polygonOptions),t.addLayer(this._shownPolygon)))},_hideCoverage:function(){this._shownPolygon&&(this._map.removeLayer(this._shownPolygon),this._shownPolygon=null)},_unbindEvents:function(){var e=this.options.spiderfyOnMaxZoom,t=this.options.showCoverageOnHover,i=this.options.zoomToBoundsOnClick,n=this._map;(e||i)&&this.off(\\\"clusterclick\\\",this._zoomOrSpiderfy,this),t&&(this.off(\\\"clustermouseover\\\",this._showCoverage,this),this.off(\\\"clustermouseout\\\",this._hideCoverage,this),n.off(\\\"zoomend\\\",this._hideCoverage,this))},_zoomEnd:function(){this._map&&(this._mergeSplitClusters(),this._zoom=Math.round(this._map._zoom),this._currentShownBounds=this._getExpandedVisibleBounds())},_moveEnd:function(){if(!this._inZoomAnimation){var e=this._getExpandedVisibleBounds();this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),this._zoom,e),this._topClusterLevel._recursivelyAddChildrenToMap(null,Math.round(this._map._zoom),e),this._currentShownBounds=e}},_generateInitialClusters:function(){var e=Math.ceil(this._map.getMaxZoom()),t=Math.floor(this._map.getMinZoom()),i=this.options.maxClusterRadius,n=i;\\\"function\\\"!=typeof i&&(n=function(){return i}),null!==this.options.disableClusteringAtZoom&&(e=this.options.disableClusteringAtZoom-1),this._maxZoom=e,this._gridClusters={},this._gridUnclustered={};for(var r=e;r>=t;r--)this._gridClusters[r]=new L.DistanceGrid(n(r)),this._gridUnclustered[r]=new L.DistanceGrid(n(r));this._topClusterLevel=new this._markerCluster(this,t-1)},_addLayer:function(e,t){var i,n,r=this._gridClusters,s=this._gridUnclustered,o=Math.floor(this._map.getMinZoom());for(this.options.singleMarkerMode&&this._overrideMarkerIcon(e),e.on(this._childMarkerEventHandlers,this);t>=o;t--){i=this._map.project(e.getLatLng(),t);var a=r[t].getNearObject(i);if(a)return a._addChild(e),e.__parent=a,void 0;if(a=s[t].getNearObject(i)){var h=a.__parent;h&&this._removeLayer(a,!1);var l=new this._markerCluster(this,t,a,e);r[t].addObject(l,this._map.project(l._cLatLng,t)),a.__parent=l,e.__parent=l;var u=l;for(n=t-1;n>h._zoom;n--)u=new this._markerCluster(this,n,u),r[n].addObject(u,this._map.project(a.getLatLng(),n));return h._addChild(u),this._removeFromGridUnclustered(a,t),void 0}s[t].addObject(e,i)}this._topClusterLevel._addChild(e),e.__parent=this._topClusterLevel},_refreshClustersIcons:function(){this._featureGroup.eachLayer(function(e){e instanceof L.MarkerCluster&&e._iconNeedsUpdate&&e._updateIcon()})},_enqueue:function(e){this._queue.push(e),this._queueTimeout||(this._queueTimeout=setTimeout(L.bind(this._processQueue,this),300))},_processQueue:function(){for(var e=0;e\u003Cthis._queue.length;e++)this._queue[e].call(this);this._queue.length=0,clearTimeout(this._queueTimeout),this._queueTimeout=null},_mergeSplitClusters:function(){var e=Math.round(this._map._zoom);this._processQueue(),this._zoom\u003Ce&&this._currentShownBounds.intersects(this._getExpandedVisibleBounds())?(this._animationStart(),this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),this._zoom,this._getExpandedVisibleBounds()),this._animationZoomIn(this._zoom,e)):this._zoom>e?(this._animationStart(),this._animationZoomOut(this._zoom,e)):this._moveEnd()},_getExpandedVisibleBounds:function(){return this.options.removeOutsideVisibleBounds?L.Browser.mobile?this._checkBoundsMaxLat(this._map.getBounds()):this._checkBoundsMaxLat(this._map.getBounds().pad(1)):this._mapBoundsInfinite},_checkBoundsMaxLat:function(e){var t=this._maxLat;return void 0!==t&&(e.getNorth()>=t&&(e._northEast.lat=1/0),e.getSouth()\u003C=-t&&(e._southWest.lat=-1/0)),e},_animationAddLayerNonAnimated:function(e,t){if(t===e)this._featureGroup.addLayer(e);else if(2===t._childCount){t._addToMap();var i=t.getAllChildMarkers();this._featureGroup.removeLayer(i[0]),this._featureGroup.removeLayer(i[1])}else t._updateIcon()},_extractNonGroupLayers:function(e,t){var i,n=e.getLayers(),r=0;for(t=t||[];r\u003Cn.length;r++)i=n[r],i instanceof L.LayerGroup?this._extractNonGroupLayers(i,t):t.push(i);return t},_overrideMarkerIcon:function(e){var t=e.options.icon=this.options.iconCreateFunction({getChildCount:function(){return 1},getAllChildMarkers:function(){return[e]}});return t}});L.MarkerClusterGroup.include({_mapBoundsInfinite:new L.LatLngBounds(new L.LatLng(-1/0,-1/0),new L.LatLng(1/0,1/0))}),L.MarkerClusterGroup.include({_noAnimation:{_animationStart:function(){},_animationZoomIn:function(e,t){this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),e),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this.fire(\\\"animationend\\\")},_animationZoomOut:function(e,t){this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),e),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this.fire(\\\"animationend\\\")},_animationAddLayer:function(e,t){this._animationAddLayerNonAnimated(e,t)}},_withAnimation:{_animationStart:function(){this._map._mapPane.className+=\\\" leaflet-cluster-anim\\\",this._inZoomAnimation++},_animationZoomIn:function(e,t){var i,n=this._getExpandedVisibleBounds(),r=this._featureGroup,s=Math.floor(this._map.getMinZoom());this._ignoreMove=!0,this._topClusterLevel._recursively(n,e,s,function(s){var o,a=s._latlng,h=s._markers;for(n.contains(a)||(a=null),s._isSingleParent()&&e+1===t?(r.removeLayer(s),s._recursivelyAddChildrenToMap(null,t,n)):(s.clusterHide(),s._recursivelyAddChildrenToMap(a,t,n)),i=h.length-1;i>=0;i--)o=h[i],n.contains(o._latlng)||r.removeLayer(o)}),this._forceLayout(),this._topClusterLevel._recursivelyBecomeVisible(n,t),r.eachLayer(function(e){e instanceof L.MarkerCluster||!e._icon||e.clusterShow()}),this._topClusterLevel._recursively(n,e,t,function(e){e._recursivelyRestoreChildPositions(t)}),this._ignoreMove=!1,this._enqueue(function(){this._topClusterLevel._recursively(n,e,s,function(e){r.removeLayer(e),e.clusterShow()}),this._animationEnd()})},_animationZoomOut:function(e,t){this._animationZoomOutSingle(this._topClusterLevel,e-1,t),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,Math.floor(this._map.getMinZoom()),e,this._getExpandedVisibleBounds())},_animationAddLayer:function(e,t){var i=this,n=this._featureGroup;n.addLayer(e),t!==e&&(t._childCount>2?(t._updateIcon(),this._forceLayout(),this._animationStart(),e._setPos(this._map.latLngToLayerPoint(t.getLatLng())),e.clusterHide(),this._enqueue(function(){n.removeLayer(e),e.clusterShow(),i._animationEnd()})):(this._forceLayout(),i._animationStart(),i._animationZoomOutSingle(t,this._map.getMaxZoom(),this._zoom)))}},_animationZoomOutSingle:function(e,t,i){var n=this._getExpandedVisibleBounds(),r=Math.floor(this._map.getMinZoom());e._recursivelyAnimateChildrenInAndAddSelfToMap(n,r,t+1,i);var s=this;this._forceLayout(),e._recursivelyBecomeVisible(n,i),this._enqueue(function(){if(1===e._childCount){var o=e._markers[0];this._ignoreMove=!0,o.setLatLng(o.getLatLng()),this._ignoreMove=!1,o.clusterShow&&o.clusterShow()}else e._recursively(n,i,r,function(e){e._recursivelyRemoveChildrenFromMap(n,r,t+1)});s._animationEnd()})},_animationEnd:function(){this._map&&(this._map._mapPane.className=this._map._mapPane.className.replace(\\\" leaflet-cluster-anim\\\",\\\"\\\")),this._inZoomAnimation--,this.fire(\\\"animationend\\\")},_forceLayout:function(){L.Util.falseFn(document.body.offsetWidth)}}),L.markerClusterGroup=function(e){return new L.MarkerClusterGroup(e)};var i=L.MarkerCluster=L.Marker.extend({options:L.Icon.prototype.options,initialize:function(e,t,i,n){L.Marker.prototype.initialize.call(this,i?i._cLatLng||i.getLatLng():new L.LatLng(0,0),{icon:this,pane:e.options.clusterPane}),this._group=e,this._zoom=t,this._markers=[],this._childClusters=[],this._childCount=0,this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._bounds=new L.LatLngBounds,i&&this._addChild(i),n&&this._addChild(n)},getAllChildMarkers:function(e){e=e||[];for(var t=this._childClusters.length-1;t>=0;t--)this._childClusters[t].getAllChildMarkers(e);for(var i=this._markers.length-1;i>=0;i--)e.push(this._markers[i]);return e},getChildCount:function(){return this._childCount},zoomToBounds:function(e){for(var t,i=this._childClusters.slice(),n=this._group._map,r=n.getBoundsZoom(this._bounds),s=this._zoom+1,o=n.getZoom();i.length>0&&r>s;){s++;var a=[];for(t=0;t\u003Ci.length;t++)a=a.concat(i[t]._childClusters);i=a}r>s?this._group._map.setView(this._latlng,s):o>=r?this._group._map.setView(this._latlng,o+1):this._group._map.fitBounds(this._bounds,e)},getBounds:function(){var e=new L.LatLngBounds;return e.extend(this._bounds),e},_updateIcon:function(){this._iconNeedsUpdate=!0,this._icon&&this.setIcon(this)},createIcon:function(){return this._iconNeedsUpdate&&(this._iconObj=this._group.options.iconCreateFunction(this),this._iconNeedsUpdate=!1),this._iconObj.createIcon()},createShadow:function(){return this._iconObj.createShadow()},_addChild:function(e,t){this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._setClusterCenter(e),e instanceof L.MarkerCluster?(t||(this._childClusters.push(e),e.__parent=this),this._childCount+=e._childCount):(t||this._markers.push(e),this._childCount++),this.__parent&&this.__parent._addChild(e,!0)},_setClusterCenter:function(e){this._cLatLng||(this._cLatLng=e._cLatLng||e._latlng)},_resetBounds:function(){var e=this._bounds;e._southWest&&(e._southWest.lat=1/0,e._southWest.lng=1/0),e._northEast&&(e._northEast.lat=-1/0,e._northEast.lng=-1/0)},_recalculateBounds:function(){var e,t,i,n,r=this._markers,s=this._childClusters,o=0,a=0,h=this._childCount;if(0!==h){for(this._resetBounds(),e=0;e\u003Cr.length;e++)i=r[e]._latlng,this._bounds.extend(i),o+=i.lat,a+=i.lng;for(e=0;e\u003Cs.length;e++)t=s[e],t._boundsNeedUpdate&&t._recalculateBounds(),this._bounds.extend(t._bounds),i=t._wLatLng,n=t._childCount,o+=i.lat*n,a+=i.lng*n;this._latlng=this._wLatLng=new L.LatLng(o/h,a/h),this._boundsNeedUpdate=!1}},_addToMap:function(e){e&&(this._backupLatlng=this._latlng,this.setLatLng(e)),this._group._featureGroup.addLayer(this)},_recursivelyAnimateChildrenIn:function(e,t,i){this._recursively(e,this._group._map.getMinZoom(),i-1,function(e){var i,n,r=e._markers;for(i=r.length-1;i>=0;i--)n=r[i],n._icon&&(n._setPos(t),n.clusterHide())},function(e){var i,n,r=e._childClusters;for(i=r.length-1;i>=0;i--)n=r[i],n._icon&&(n._setPos(t),n.clusterHide())})},_recursivelyAnimateChildrenInAndAddSelfToMap:function(e,t,i,n){this._recursively(e,n,t,function(r){r._recursivelyAnimateChildrenIn(e,r._group._map.latLngToLayerPoint(r.getLatLng()).round(),i),r._isSingleParent()&&i-1===n?(r.clusterShow(),r._recursivelyRemoveChildrenFromMap(e,t,i)):r.clusterHide(),r._addToMap()})},_recursivelyBecomeVisible:function(e,t){this._recursively(e,this._group._map.getMinZoom(),t,null,function(e){e.clusterShow()})},_recursivelyAddChildrenToMap:function(e,t,i){this._recursively(i,this._group._map.getMinZoom()-1,t,function(n){if(t!==n._zoom)for(var r=n._markers.length-1;r>=0;r--){var s=n._markers[r];i.contains(s._latlng)&&(e&&(s._backupLatlng=s.getLatLng(),s.setLatLng(e),s.clusterHide&&s.clusterHide()),n._group._featureGroup.addLayer(s))}},function(t){t._addToMap(e)})},_recursivelyRestoreChildPositions:function(e){for(var t=this._markers.length-1;t>=0;t--){var i=this._markers[t];i._backupLatlng&&(i.setLatLng(i._backupLatlng),delete i._backupLatlng)}if(e-1===this._zoom)for(var n=this._childClusters.length-1;n>=0;n--)this._childClusters[n]._restorePosition();else for(var r=this._childClusters.length-1;r>=0;r--)this._childClusters[r]._recursivelyRestoreChildPositions(e)},_restorePosition:function(){this._backupLatlng&&(this.setLatLng(this._backupLatlng),delete this._backupLatlng)},_recursivelyRemoveChildrenFromMap:function(e,t,i,n){var r,s;this._recursively(e,t-1,i-1,function(e){for(s=e._markers.length-1;s>=0;s--)r=e._markers[s],n&&n.contains(r._latlng)||(e._group._featureGroup.removeLayer(r),r.clusterShow&&r.clusterShow())},function(e){for(s=e._childClusters.length-1;s>=0;s--)r=e._childClusters[s],n&&n.contains(r._latlng)||(e._group._featureGroup.removeLayer(r),r.clusterShow&&r.clusterShow())})},_recursively:function(e,t,i,n,r){var s,o,a=this._childClusters,h=this._zoom;if(h>=t&&(n&&n(this),r&&h===i&&r(this)),t>h||i>h)for(s=a.length-1;s>=0;s--)o=a[s],e.intersects(o._bounds)&&o._recursively(e,t,i,n,r)},_isSingleParent:function(){return this._childClusters.length>0&&this._childClusters[0]._childCount===this._childCount}});L.Marker.include({clusterHide:function(){return this.options.opacityWhenUnclustered=this.options.opacity||1,this.setOpacity(0)},clusterShow:function(){var e=this.setOpacity(this.options.opacity||this.options.opacityWhenUnclustered);return delete this.options.opacityWhenUnclustered,e}}),L.DistanceGrid=function(e){this._cellSize=e,this._sqCellSize=e*e,this._grid={},this._objectPoint={}},L.DistanceGrid.prototype={addObject:function(e,t){var i=this._getCoord(t.x),n=this._getCoord(t.y),r=this._grid,s=r[n]=r[n]||{},o=s[i]=s[i]||[],a=L.Util.stamp(e);this._objectPoint[a]=t,o.push(e)},updateObject:function(e,t){this.removeObject(e),this.addObject(e,t)},removeObject:function(e,t){var i,n,r=this._getCoord(t.x),s=this._getCoord(t.y),o=this._grid,a=o[s]=o[s]||{},h=a[r]=a[r]||[];for(delete this._objectPoint[L.Util.stamp(e)],i=0,n=h.length;n>i;i++)if(h[i]===e)return h.splice(i,1),1===n&&delete a[r],!0},eachObject:function(e,t){var i,n,r,s,o,a,h,l=this._grid;for(i in l){o=l[i];for(n in o)for(a=o[n],r=0,s=a.length;s>r;r++)h=e.call(t,a[r]),h&&(r--,s--)}},getNearObject:function(e){var t,i,n,r,s,o,a,h,l=this._getCoord(e.x),u=this._getCoord(e.y),_=this._objectPoint,d=this._sqCellSize,c=null;for(t=u-1;u+1>=t;t++)if(r=this._grid[t])for(i=l-1;l+1>=i;i++)if(s=r[i])for(n=0,o=s.length;o>n;n++)a=s[n],h=this._sqDist(_[L.Util.stamp(a)],e),(d>h||d>=h&&null===c)&&(d=h,c=a);return c},_getCoord:function(e){var t=Math.floor(e/this._cellSize);return isFinite(t)?t:e},_sqDist:function(e,t){var i=t.x-e.x,n=t.y-e.y;return i*i+n*n}},function(){L.QuickHull={getDistant:function(e,t){var i=t[1].lat-t[0].lat,n=t[0].lng-t[1].lng;return n*(e.lat-t[0].lat)+i*(e.lng-t[0].lng)},findMostDistantPointFromBaseLine:function(e,t){var i,n,r,s=0,o=null,a=[];for(i=t.length-1;i>=0;i--)n=t[i],r=this.getDistant(n,e),r>0&&(a.push(n),r>s&&(s=r,o=n));return{maxPoint:o,newPoints:a}},buildConvexHull:function(e,t){var i=[],n=this.findMostDistantPointFromBaseLine(e,t);return n.maxPoint?(i=i.concat(this.buildConvexHull([e[0],n.maxPoint],n.newPoints)),i=i.concat(this.buildConvexHull([n.maxPoint,e[1]],n.newPoints))):[e[0]]},getConvexHull:function(e){var t,i=!1,n=!1,r=!1,s=!1,o=null,a=null,h=null,l=null,u=null,_=null;for(t=e.length-1;t>=0;t--){var d=e[t];(i===!1||d.lat>i)&&(o=d,i=d.lat),(n===!1||d.lat\u003Cn)&&(a=d,n=d.lat),(r===!1||d.lng>r)&&(h=d,r=d.lng),(s===!1||d.lng\u003Cs)&&(l=d,s=d.lng)}n!==i?(_=a,u=o):(_=l,u=h);var c=[].concat(this.buildConvexHull([_,u],e),this.buildConvexHull([u,_],e));return c}}}(),L.MarkerCluster.include({getConvexHull:function(){var e,t,i=this.getAllChildMarkers(),n=[];for(t=i.length-1;t>=0;t--)e=i[t].getLatLng(),n.push(e);return L.QuickHull.getConvexHull(n)}}),L.MarkerCluster.include({_2PI:2*Math.PI,_circleFootSeparation:25,_circleStartAngle:0,_spiralFootSeparation:28,_spiralLengthStart:11,_spiralLengthFactor:5,_circleSpiralSwitchover:9,spiderfy:function(){if(this._group._spiderfied!==this&&!this._group._inZoomAnimation){var e,t=this.getAllChildMarkers(),i=this._group,n=i._map,r=n.latLngToLayerPoint(this._latlng);this._group._unspiderfy(),this._group._spiderfied=this,t.length>=this._circleSpiralSwitchover?e=this._generatePointsSpiral(t.length,r):(r.y+=10,e=this._generatePointsCircle(t.length,r)),this._animationSpiderfy(t,e)}},unspiderfy:function(e){this._group._inZoomAnimation||(this._animationUnspiderfy(e),this._group._spiderfied=null)},_generatePointsCircle:function(e,t){var i,n,r=this._group.options.spiderfyDistanceMultiplier*this._circleFootSeparation*(2+e),s=r/this._2PI,o=this._2PI/e,a=[];for(s=Math.max(s,35),a.length=e,i=0;e>i;i++)n=this._circleStartAngle+i*o,a[i]=new L.Point(t.x+s*Math.cos(n),t.y+s*Math.sin(n))._round();return a},_generatePointsSpiral:function(e,t){var i,n=this._group.options.spiderfyDistanceMultiplier,r=n*this._spiralLengthStart,s=n*this._spiralFootSeparation,o=n*this._spiralLengthFactor*this._2PI,a=0,h=[];for(h.length=e,i=e;i>=0;i--)e>i&&(h[i]=new L.Point(t.x+r*Math.cos(a),t.y+r*Math.sin(a))._round()),a+=s/r+5e-4*i,r+=o/a;return h},_noanimationUnspiderfy:function(){var e,t,i=this._group,n=i._map,r=i._featureGroup,s=this.getAllChildMarkers();for(i._ignoreMove=!0,this.setOpacity(1),t=s.length-1;t>=0;t--)e=s[t],r.removeLayer(e),e._preSpiderfyLatlng&&(e.setLatLng(e._preSpiderfyLatlng),delete e._preSpiderfyLatlng),e.setZIndexOffset&&e.setZIndexOffset(0),e._spiderLeg&&(n.removeLayer(e._spiderLeg),delete e._spiderLeg);i.fire(\\\"unspiderfied\\\",{cluster:this,markers:s}),i._ignoreMove=!1,i._spiderfied=null}}),L.MarkerClusterNonAnimated=L.MarkerCluster.extend({_animationSpiderfy:function(e,t){var i,n,r,s,o=this._group,a=o._map,h=o._featureGroup,l=this._group.options.spiderLegPolylineOptions;for(o._ignoreMove=!0,i=0;i\u003Ce.length;i++)s=a.layerPointToLatLng(t[i]),n=e[i],r=new L.Polyline([this._latlng,s],l),a.addLayer(r),n._spiderLeg=r,n._preSpiderfyLatlng=n._latlng,n.setLatLng(s),n.setZIndexOffset&&n.setZIndexOffset(1e6),h.addLayer(n);this.setOpacity(.3),o._ignoreMove=!1,o.fire(\\\"spiderfied\\\",{cluster:this,markers:e})},_animationUnspiderfy:function(){this._noanimationUnspiderfy()}}),L.MarkerCluster.include({_animationSpiderfy:function(e,t){var i,n,r,s,o,a,h=this,l=this._group,u=l._map,_=l._featureGroup,d=this._latlng,c=u.latLngToLayerPoint(d),p=L.Path.SVG,f=L.extend({},this._group.options.spiderLegPolylineOptions),m=f.opacity;for(void 0===m&&(m=L.MarkerClusterGroup.prototype.options.spiderLegPolylineOptions.opacity),p?(f.opacity=0,f.className=(f.className||\\\"\\\")+\\\" leaflet-cluster-spider-leg\\\"):f.opacity=m,l._ignoreMove=!0,i=0;i\u003Ce.length;i++)n=e[i],a=u.layerPointToLatLng(t[i]),r=new L.Polyline([d,a],f),u.addLayer(r),n._spiderLeg=r,p&&(s=r._path,o=s.getTotalLength()+.1,s.style.strokeDasharray=o,s.style.strokeDashoffset=o),n.setZIndexOffset&&n.setZIndexOffset(1e6),n.clusterHide&&n.clusterHide(),_.addLayer(n),n._setPos&&n._setPos(c);for(l._forceLayout(),l._animationStart(),i=e.length-1;i>=0;i--)a=u.layerPointToLatLng(t[i]),n=e[i],n._preSpiderfyLatlng=n._latlng,n.setLatLng(a),n.clusterShow&&n.clusterShow(),p&&(r=n._spiderLeg,s=r._path,s.style.strokeDashoffset=0,r.setStyle({opacity:m}));this.setOpacity(.3),l._ignoreMove=!1,setTimeout(function(){l._animationEnd(),l.fire(\\\"spiderfied\\\",{cluster:h,markers:e})},200)},_animationUnspiderfy:function(e){var t,i,n,r,s,o,a=this,h=this._group,l=h._map,u=h._featureGroup,_=e?l._latLngToNewLayerPoint(this._latlng,e.zoom,e.center):l.latLngToLayerPoint(this._latlng),d=this.getAllChildMarkers(),c=L.Path.SVG;for(h._ignoreMove=!0,h._animationStart(),this.setOpacity(1),i=d.length-1;i>=0;i--)t=d[i],t._preSpiderfyLatlng&&(t.closePopup(),t.setLatLng(t._preSpiderfyLatlng),delete t._preSpiderfyLatlng,o=!0,t._setPos&&(t._setPos(_),o=!1),t.clusterHide&&(t.clusterHide(),o=!1),o&&u.removeLayer(t),c&&(n=t._spiderLeg,r=n._path,s=r.getTotalLength()+.1,r.style.strokeDashoffset=s,n.setStyle({opacity:0})));h._ignoreMove=!1,setTimeout(function(){var e=0;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&e++;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&(t.clusterShow&&t.clusterShow(),t.setZIndexOffset&&t.setZIndexOffset(0),e>1&&u.removeLayer(t),l.removeLayer(t._spiderLeg),delete t._spiderLeg);h._animationEnd(),h.fire(\\\"unspiderfied\\\",{cluster:a,markers:d})},200)}}),L.MarkerClusterGroup.include({_spiderfied:null,unspiderfy:function(){this._unspiderfy.apply(this,arguments)},_spiderfierOnAdd:function(){this._map.on(\\\"click\\\",this._unspiderfyWrapper,this),this._map.options.zoomAnimation&&this._map.on(\\\"zoomstart\\\",this._unspiderfyZoomStart,this),this._map.on(\\\"zoomend\\\",this._noanimationUnspiderfy,this),L.Browser.touch||this._map.getRenderer(this)},_spiderfierOnRemove:function(){this._map.off(\\\"click\\\",this._unspiderfyWrapper,this),this._map.off(\\\"zoomstart\\\",this._unspiderfyZoomStart,this),this._map.off(\\\"zoomanim\\\",this._unspiderfyZoomAnim,this),this._map.off(\\\"zoomend\\\",this._noanimationUnspiderfy,this),this._noanimationUnspiderfy()\\n},_unspiderfyZoomStart:function(){this._map&&this._map.on(\\\"zoomanim\\\",this._unspiderfyZoomAnim,this)},_unspiderfyZoomAnim:function(e){L.DomUtil.hasClass(this._map._mapPane,\\\"leaflet-touching\\\")||(this._map.off(\\\"zoomanim\\\",this._unspiderfyZoomAnim,this),this._unspiderfy(e))},_unspiderfyWrapper:function(){this._unspiderfy()},_unspiderfy:function(e){this._spiderfied&&this._spiderfied.unspiderfy(e)},_noanimationUnspiderfy:function(){this._spiderfied&&this._spiderfied._noanimationUnspiderfy()},_unspiderfyLayer:function(e){e._spiderLeg&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow(),e.setZIndexOffset&&e.setZIndexOffset(0),this._map.removeLayer(e._spiderLeg),delete e._spiderLeg)}}),L.MarkerClusterGroup.include({refreshClusters:function(e){return e?e instanceof L.MarkerClusterGroup?e=e._topClusterLevel.getAllChildMarkers():e instanceof L.LayerGroup?e=e._layers:e instanceof L.MarkerCluster?e=e.getAllChildMarkers():e instanceof L.Marker&&(e=[e]):e=this._topClusterLevel.getAllChildMarkers(),this._flagParentsIconsNeedUpdate(e),this._refreshClustersIcons(),this.options.singleMarkerMode&&this._refreshSingleMarkerModeMarkers(e),this},_flagParentsIconsNeedUpdate:function(e){var t,i;for(t in e)for(i=e[t].__parent;i;)i._iconNeedsUpdate=!0,i=i.__parent},_refreshSingleMarkerModeMarkers:function(e){var t,i;for(t in e)i=e[t],this.hasLayer(i)&&i.setIcon(this._overrideMarkerIcon(i))}}),L.Marker.include({refreshIconOptions:function(e,t){var i=this.options.icon;return L.setOptions(i,e),this.setIcon(i),t&&this.__parent&&this.__parent._group.refreshClusters(this),this}}),e.MarkerClusterGroup=t,e.MarkerCluster=i});\\n//# sourceMappingURL=leaflet.markercluster.js.map\\n}\\n\",\n \"type\": \"application/javascript\",\n \"title\": \"$:/plugins/sycom/leaflet/lib/leaflet-markercluster.js\",\n \"module-type\": \"library\"\n },\n \"$:/plugins/sycom/leaflet/mapCssTweaks.css.tid\": {\n \"title\": \"$:/plugins/sycom/leaflet/mapCssTweaks.css.tid\",\n \"created\": \"20161028202401905\",\n \"modified\": \"20161111151011600\",\n \"tags\": \"[[$:/tags/Stylesheet]]\",\n \"text\": \"\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\\n\\n/* add some styling tweaks to leaflet */\\n.leaflet-right {\\n\\tmax-width:50%\\n}\\n.leaflet-popup-content h6 {\\n\\tfont-size:.7rem;\\n\\tmargin:0 0 .2rem 0\\n}\\n\\n.leaflet-control-attribution {\\n\\theight:1.5em;\\n}\\n.leaflet-control-attribution:hover {\\n\\theight:auto;\\n}\\n\\n.leaflet-top, .leaflet-bottom {\\n z-index:999;\\n}\\n\\n/* solve conflict between tw and leaflet */\\n.leaflet-zoom-animated {max-width: initial !important}\\n\\n/* solve background image problem for layer control */\\n.leaflet-control-layers-toggle {\\n\\tbackground-image: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20height%3D%2226%22%20width%3D%2226%22%3E%3Cpath%20d%3D%22M.032%2017.056l13-8%2013%208-13%208-13-8%22%20fill%3D%22%23b9b9b9%22/%3E%3Cpath%20d%3D%22M.032%2017.056l-.032.93%2013%208%2013-8%20.032-.93-13%208z%22%20fill%3D%22%23737373%22/%3E%3Cpath%20d%3D%22M0%2013.076l13-8%2013%208-13%208-13-8%22%20fill%3D%22%23cdcdcd%22/%3E%3Cpath%20d%3D%22M0%2013.076v.91l13%208%2013-8v-.91l-13%208z%22%20fill%3D%22%23737373%22/%3E%3Cpath%20d%3D%22M0%208.986l13-8%2013%208-13%208-13-8%22%20fill-opacity%3D%22.585%22%20stroke%3D%22%23797979%22%20stroke-width%3D%22.1%22%20fill%3D%22%23e9e9e9%22/%3E%3Cpath%20d%3D%22M0%208.986v1l13%208%2013-8v-1l-13%208z%22%20fill%3D%22%23737373%22/%3E%3C/svg%3E') !important\\n}\\n\\n/* default polygon stylin */\\n.polyline {fill:none}\\n.leaflet-popup-content ul {padding:0 1em}\\n\\n/* some styling for clusters */\\n.marker-cluster div {\\n min-width:16px;min-height:16px;\\n border-radius:50%;border:none;\\n vertical-align:middle;text-align:center;font-weight:bold\\n }\\n.marker-cluster div div{width:100%;height:100%}\\n.marker-cluster div span {display:block;text-shadow:0px 0px 6px #ffffff}\\n\\npath.leaflet-clickable {fill:\u003C\u003Ccolour primary>>;fill-opacity: 0.5;stroke:\u003C\u003Ccolour primary>>}\\n.leaflet-marker-colored {fill:\u003C\u003Ccolour primary>>}\\n\"\n },\n \"$:/plugins/sycom/leaflet/mapWidget.tid\": {\n \"title\": \"$:/plugins/sycom/leaflet/mapWidget.tid\",\n \"text\": \"/*\\\\\\ncreated: 20151028202401905\\nmodified: 20170318234011605\\ntitle: $:/plugins/sycom/leaflet/mapWidget.tid\\ntype: application/javascript\\nmodule-type: widget\\n\\nA widget for displaying leaflet map in TiddlyWiki\\n\\n\\\\*/\\n\\n(function() {\\n /* ----------------------- */\\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n \\\"use strict\\\";\\n var Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget,\\n L = require(\\\"$:/plugins/sycom/leaflet/lib/leaflet.js\\\"),\\n markerClusterGroup = require(\\\"$:/plugins/sycom/leaflet/lib/leaflet-markercluster.js\\\");\\n\\n var mapWidget = function(parseTreeNode, options) {\\n this.initialise(parseTreeNode, options);\\n };\\n\\n // global vars\\n var Map = [], // map collection\\n map = 0, // map order number\\n tn = 0, // tiddler number\\n fCluster = [], // the clusters\\n Colour = [], // the colors\\n clusterRadius = [], // cluster radii\\n clusterType = [], // clustering for whole map or for each tiddler\\n lfltDefBounds = [\\n [52.75, -2.55],\\n [52.85, -2.65]\\n ], // default bounds when nothing given\\n bounds, // global bounds for map ?todo one per map?\\n iter = [], // iteration indicator to avoid infinite loops\\n setting = {}; // the map's settings\\n\\n /* Inherit from the base widget class */\\n mapWidget.prototype = new Widget();\\n\\n /* Render this widget into the DOM */\\n mapWidget.prototype.render = function(parent, nextSibling) {\\n bounds = null;\\n // Compute our attributes\\n this.computeAttributes();\\n // Get the base settings for rendering : width / height (default : 100% / 500px)\\n // !todo : make a settings tidller in order to let user set it for the whole wiki (may be inspired from roadtree)\\n // !todo what happens if windows is resized?\\n var width = this.getAttribute(\\\"width\\\", \\\"100%\\\"),\\n height = this.getAttribute(\\\"height\\\", \\\"420px\\\");\\n // creating the div container\\n var div = this.document.createElement(\\\"div\\\");\\n div.setAttribute(\\\"id\\\", \\\"lfltMap-\\\" + map);\\n div.setAttribute(\\\"style\\\", \\\"width:\\\" + width + \\\";height:\\\" + height);\\n // Save the parent dom node\\n this.parentDomNode = parent;\\n // Compute our attributes\\n // this.computeAttributes();\\n // create the container\\n parent.insertBefore(div, nextSibling);\\n this.domNodes.push(div);\\n // Create the map\\n this.createMap();\\n // Execute our logic\\n this.execute();\\n // increment map number indicator\\n map += 1;\\n };\\n\\n /* Create the map for the widget */\\n mapWidget.prototype.createMap = function(parent, nextSibling) {\\n // create the leaflet and push it to #lfltMap\\n Map[map] = L.map('lfltMap-' + map);\\n // Install base tile layer (if none provided, default is \\\"osm\\\")\\n // get tilelayers from JSON\\n var fonds = JSON.parse(this.wiki.getTiddlerText(\\\"$:/plugins/sycom/leaflet/lib/tileLayers.json\\\"));\\n // create tile layers list object from json list\\n var Tiles = []; // leaflet tile layers\\n var tiles = {}; // tile identifier for control\\n // look for tile parameter\\n setting.tile = this.getAttribute(\\\"tile\\\", \\\"osm\\\");\\n setting.marker = this.getAttribute(\\\"marker\\\", null);\\n // create tile layer list\\n for (var i in fonds) {\\n if (i == setting.tile || fonds[i].id == setting.tile) {\\n setting.tile = fonds[i].id;\\n }\\n var couche = new L.TileLayer(fonds[i].url, {\\n attribution: fonds[i].attrib,\\n minZoom: fonds[i].zMin,\\n maxZoom: fonds[i].zMax,\\n unloadInvisibleTiles: true\\n });\\n Tiles[fonds[i].id] = couche;\\n tiles[fonds[i].nom] = couche;\\n }\\n // if user entered a wrong tile id\\n if (Tiles[setting.tile] === undefined) {\\n setting.tile = \\\"osm\\\";\\n $tw.utils.error(\\\"Seems you entered a wrong tile id, displayed osm instead. Please refer to plugin documentation to avoid this - error : \\\" + error);\\n }\\n Tiles[setting.tile].addTo(Map[map]);\\n // install tile layer control if needed\\n setting.tileControl = this.getAttribute(\\\"tileControl\\\");\\n if (setting.tileControl) {\\n var tControl = L.control.layers(tiles);\\n tControl.addTo(Map[map]);\\n }\\n /* !todo to come next (will have to implement leaflet.draw extension)\\n // look for draw parameter\\n setting.drawControl = this.getAttribute(\\\"drawControl\\\");\\n if (setting.drawControl) {\\n // Initialize the FeatureGroup to store editable layers\\n var drawnItems = new L.FeatureGroup();\\n Map[map].addLayer(drawnItems);\\n // Initialize the draw control and pass it the FeatureGroup of editable layers\\n var drawControl = new L.Control.Draw({\\n edit: {\\n featureGroup: drawnItems\\n }\\n }\\n );\\n Map[map].addControl(drawControl);\\n }\\n*/\\n };\\n\\n /* Compute the internal state of the widget */\\n mapWidget.prototype.execute = function() {\\n // getting wiki primary color\\n // check if you defined a tiddler name for palette but no tiddler with that\\n if(this.wiki.getTiddlerData(this.wiki.getTiddlerText(\\\"$:/palette\\\"))) Colour.wiki = this.wiki.getTiddlerData(this.wiki.getTiddlerText(\\\"$:/palette\\\")).primary;\\n // switch back to basic blue\\n else Colour.wiki = \\\"#5778d8\\\";\\n\\n // switch back to basic tiddlywiki blue if primary is defined from another color\\n /* notes to upgrade this process\\n if primaire is \u003C\u003Ccolour xxxx>> set to default gray\\n if primaire.match(\\\"\u003C\u003C\\\") primaire=\\\"#555\\\"; */\\n if (Colour.wiki.match(/\u003C/g)) Colour.wiki = \\\"#5778d8\\\";\\n\\n // getting style parameters\\n var style = this.getAttribute(\\\"style\\\", undefined);\\n var st;\\n // case style defined\\n if(style !== undefined) {\\n st = JSON.parse(style);\\n // color parameter will overwrite style color and style fillColor parameter\\n if(st.fillColor) Colour[map] = this.getAttribute(\\\"color\\\", st.fillColor);\\n else Colour[map] = this.getAttribute(\\\"color\\\", st.color);\\n }\\n // case style undefined\\n else {\\n st = null;\\n // checking if user defined a color if no color go undefined\\n Colour[map] = this.getAttribute(\\\"color\\\", undefined);\\n }\\n // create default icon\\n // ?todo: only if there are points to display?\\n L.icon.default = lfltIcon(setColor(null, map), setting.marker, map);\\n\\n // create whole map cluster\\n // getting cluster size parameter, if exists\\n clusterRadius[map] = this.getAttribute(\\\"cluster\\\", 80);\\n clusterType[map] = this.getAttribute(\\\"clusterType\\\", \\\"map\\\");\\n if (clusterRadius[map] === 0 || clusterType[map] == \\\"tiddler\\\") {\\n // if clusterRadius null or clustering by tiddler, no whole clustering\\n fCluster[map] = L.featureGroup();\\n } else {\\n // creating a cluter group for whole map\\n fCluster[map] = L.markerClusterGroup({\\n name: \\\"Cluster\\\" + map,\\n polygonOptions: {\\\"weight\\\":\\\"0.5\\\"},\\n maxClusterRadius: clusterRadius[map],\\n /* for the record. may be a function\\n function() {return (clusterRadius - 50) / 9 * Map[map].getZoom() + 50 - (clusterRadius - 50) / 9 },*/\\n iconCreateFunction: createCluster\\n });\\n }\\n // Get the declared places from the attributes\\n var places = this.getAttribute(\\\"places\\\", undefined);\\n var feature = L.featureGroup();\\n // Render the map\\n if (places) mapPlaces(this,\\n JSON.parse(places),\\n Map[map],\\n fCluster[map],\\n null,\\n Colour[map],\\n this.getAttribute(\\\"marker\\\"),\\n st\\n );\\n\\n // set map to objects bounds\\n if (bounds) {\\n Map[map].fitBounds(bounds);\\n } else {\\n bounds = lfltDefBounds;\\n Map[map].fitBounds(bounds);\\n }\\n // if lat long zoom settings, overwrite bounds\\n setting.lat = this.getAttribute(\\\"lat\\\");\\n setting.lg = this.getAttribute(\\\"long\\\");\\n setting.zoom = this.getAttribute(\\\"zoom\\\");\\n // overwrite lat and long center\\n if (setting.lat && setting.lg) {\\n Map[map].setView([setting.lat, setting.lg]);\\n }\\n // overwrite zoom\\n if (setting.zoom) {\\n Map[map].setZoom(setting.zoom);\\n }\\n };\\n\\n // mapping a places json object (parent object, places json object, destination feature, destination cluster, popup for base objects, ands style parameters : color, marker, json style)\\n function mapPlaces(obj, plcs, feat, clust, pop, col, mark, style) {\\n // create feature for this mapping turn\\n var feature = L.featureGroup();\\n // case 1 : data in a tiddler\\n if (plcs.tiddler) {\\n // if no tiddler is given (single space) map current Tiddler\\n // !todo would be much better if so when no attribute at all...\\n if (plcs.tiddler == \\\" \\\") {\\n mapTiddler(obj, obj.getVariable(\\\"currentTiddler\\\"), feature, clust, pop, col, mark, style);\\n }\\n // else, map the given tiddler\\n else {\\n // get data fields in the tiddler, let's seek for geo data\\n mapTiddler(obj, plcs.tiddler, feature, clust, pop, col, mark, style);\\n }\\n }\\n // case 2 : data in multiple tiddlers\\n if (plcs.tiddlers) {\\n mapTiddlers(obj, plcs.tiddlers, feature, clust, pop, col, mark, style);\\n }\\n // case 3 : data in tiddlers following a filter\\n if (plcs.filter) {\\n mapFilter(obj, plcs.filter, feature, clust, pop, col, mark, style);\\n }\\n // case 4 : data are directly listed in places (point(s) - polygon - polyline - geojson)\\n // for each we will\\n // - use dedicated function to populate mapping turn layer\\n // - add layer to map\\n if (plcs.point) {\\n // add the point to the cluster layer\\n mapPoint(plcs.point, clust, pop, col, mark);\\n // add the cluster layer to map\\n feature.addLayer(clust);\\n // set bounds\\n }\\n if (plcs.points) {\\n // ?todo : create a cluster for those points if clusterType == \\\"tiddler\\\"\\n mapPoints(plcs.points, clust, pop, col, mark);\\n feature.addLayer(clust);\\n }\\n if (plcs.polygon) {\\n var polygFeat = L.featureGroup();\\n mapPolyg(plcs.polygon, polygFeat, pop, col, style);\\n polygFeat.addTo(feature);\\n }\\n if (plcs.polygons) {\\n var polygsFeat = L.featureGroup();\\n mapPolygs(plcs.polygons, polygsFeat, pop, col, style);\\n polygsFeat.addTo(feature);\\n }\\n if (plcs.polyline) {\\n var polylFeat = L.featureGroup();\\n mapPolyl(plcs.polyline, polylFeat, pop, col, style);\\n polylFeat.addTo(feature);\\n }\\n if (plcs.polylines) {\\n var polylsFeat = L.featureGroup();\\n mapPolyls(plcs.polylines, polylsFeat, pop, col, style);\\n polylsFeat.addTo(feature);\\n }\\n if (plcs.geojson) {\\n // !todo : create a cluster for those points if clusterType == \\\"tiddler\\\"\\n var geojsonFeat = L.featureGroup();\\n mapGeoJson(plcs.geojson, geojsonFeat, clust, col, mark, style);\\n geojsonFeat.addTo(feat);\\n }\\n // add feature to map\\n feature.addTo(feat);\\n extBounds(feature);\\n }\\n\\n // add a marker for a point\\n function mapPoint(coord, clust, pop, col, mark) {\\n try {\\n var location = coord.split(\\\",\\\");\\n } catch (err) {displayError(\\\"point coord error\\\", err);}\\n try {\\n var marker = L.marker(location, {\\n icon: lfltIcon(col, mark, map)\\n });\\n if (pop) marker.bindPopup(pop);\\n\\t\\t\\tif (clust.count) clust.count +=1;\\n\\t\\t\\telse clust.count = 1;\\n clust.addLayer(marker);\\n } catch (err) {displayError(\\\"point marker error\\\", err);}\\n }\\n // add a marker serie for a points list\\n function mapPoints(list, clust, pop, col, mark) {\\n var Points = list.split(\\\" \\\");\\n for (var pt in Points) {\\n mapPoint(Points[pt], clust, pop, col, mark);\\n }\\n }\\n\\n // add a polygon\\n function mapPolyg(list, feat, pop, col, st) {\\n var Coords = list.split(\\\" \\\");\\n var Shape = [];\\n try {\\n for (var nd in Coords) {\\n var location = Coords[nd].split(\\\",\\\");\\n Shape.push(location);\\n }\\n } catch (err) {\\n displayError(\\\"polygone\\\", err);\\n }\\n try {\\n var polygon = L.polygon(Shape, {\\n color: setColor(col, map)\\n });\\n if (st) polygon.setStyle(checkStyle(st, col));\\n if (pop) polygon.bindPopup(pop);\\n polygon.addTo(feat);\\n } catch (err) {\\n displayError(\\\"polygone\\\", err);\\n }\\n }\\n // add a polygons collection\\n function mapPolygs(collec, feat, pop, col, st) {\\n var Polys = collec.split(\\\"|\\\");\\n for (var pg in Polys) {\\n mapPolyg(Polys[pg], feat, pop, col, st);\\n }\\n }\\n // add a polyline\\n function mapPolyl(list, feat, pop, col, st) {\\n var Coords = list.split(\\\" \\\");\\n var Line = [];\\n try {\\n for (var nd in Coords) {\\n var location = Coords[nd].split(\\\",\\\");\\n Line.push(location);\\n }\\n } catch (err) {\\n displayError(\\\"polyline\\\", err);\\n }\\n try {\\n var polyline = L.polyline(Line, {\\n color: setColor(col,map)\\n });\\n if (st) polyline.setStyle(checkStyle(st, col));\\n if (pop) polyline.bindPopup(pop);\\n // add polyline class in order to make fill transparent\\n polyline.setStyle({\\n \\\"className\\\": \\\"polyline\\\"\\n }).addTo(feat);\\n } catch (err) {\\n displayError(\\\"polyline\\\", err);\\n }\\n }\\n // add a polylines collection\\n function mapPolyls(collec, feat, pop, col, st) {\\n var Lines = collec.split(\\\"|\\\");\\n for (var ln in Lines) {\\n mapPolyl(Lines[ln], feat, pop, col, st);\\n }\\n }\\n\\n // add a geojson set\\n function mapGeoJson(geojson, feat, clust, col, mark, st) {\\n try {\\n var data = JSON.parse(geojson);\\n var geoJson = L.geoJSON(data, {\\n // adding style\\n style: function (feature) {\\n // get feature style only if style is not injected\\n // ?todo : only overwrite injected values?\\n if (st === undefined || st === null) {\\n st = {};\\n if(feature.properties.style !== undefined) st = feature.properties.style;\\n }\\n // get feature properties style if exists\\n if(feature.properties.color !== undefined) {\\n st.color = feature.properties.color;\\n st.fillColor = st.color;\\n }\\n // color parameter overwrite style color if exists\\n if (col !== undefined && col !== null) {\\n st.color = col;\\n st.fillColor = col;\\n }\\n // if no color is defined at the end, fallback\\n if (st.color === undefined) {\\n col = setColor(col, map);\\n st.color = col;\\n st.fillColor = col;\\n }\\n return st;\\n },\\n onEachFeature: function (feature, layer) {\\n layer.bindPopup(jsonPop(feature));\\n },\\n // adding points\\n pointToLayer: function(geoJsonPoint, latlng) {\\n // working to get color (from properties)\\n var cl;\\n if(geoJsonPoint.properties.color !== undefined) cl = geoJsonPoint.properties.color;\\n if(geoJsonPoint.properties.fillColor !== undefined) cl = geoJsonPoint.properties.fillColor;\\n if(col !== undefined && col !== null) cl = col;\\n // binding default icon\\n var jsonPoint = L.marker(latlng, {\\n icon: lfltIcon(cl, mark, map)\\n });\\n jsonPoint.bindPopup(jsonPop(geoJsonPoint));\\n\\t\\t\\t\\t\\tif (clust.count) clust.count +=1;\\n\\t\\t\\t\\t\\telse clust.count = 1;\\n clust.addLayer(jsonPoint);\\n }\\n });\\n\\n // ?todo : should we add clust to feat or to geoJson? should we add clust even if it's already here?\\n feat.addLayer(clust);\\n feat.addLayer(geoJson);\\n } catch (error) {displayError(\\\"there was an error when displaying geoJson. error : \\\", error);}\\n }\\n\\n // map a tiddler\\n function mapTiddler(obj, tid, feat, clust, pop, col, mark, style) {\\n if(iter.map.tid === undefined) iter.map.tid = 1;\\n else iter.map.tid +=1;\\n if(iter.map.tid \u003C 4242) {\\n // get data fields in the tiddler, let's seek for geo data\\n var flds = obj.wiki.getTiddler(tid).fields,\\n feature = L.featureGroup(), // create the tiddler feature\\n popup = \\\"\\\"; // create the popup text\\n // setting marker, color, style\\n // if no marker injected, trying to get from tiddler\\n if(mark === null || mark === undefined) {\\n if(flds.marker) mark = flds.marker;\\n }\\n // working style and color together\\n var cl, st = {};\\n // style\\n if(flds.style) st = JSON.parse(flds.style);\\n // overwrite with injected values\\n if (style !== undefined && style !== null) {\\n st = style;\\n /* ?todo : should we overwrite only injected?\\n \\tfor (var v in st) {\\n if(style.v !== undefined) st.v = style.v;\\n }\\n \\tfor (var v in style) {\\n \\t}*/\\n }\\n // color\\n if (flds.color) cl = flds.color;\\n // overwrite with injected color style if exists\\n if (style !== undefined && style !== null) {\\n if (st.fillColor !== undefined) cl = st.fillColor\\n }\\n // overwrite with injected color also in style\\n if (col !== undefined && col !== null) {\\n cl = col;\\n st.color = cl; st.fillColor = cl;\\n }\\n Colour[\\\"t\\\" + tn] = cl;\\n // if clusterType is tiddler, creating a cluster group for tiddler\\n // also will have to deal with the filter / tiddler distinction\\n if (clusterType[map] == \\\"tiddler\\\") {\\n // ?todo : automate cluster creation?\\n fCluster[\\\"t\\\" + tn] = L.markerClusterGroup({\\n name: \\\"Cluster\\\" + map + \\\"Cluster\\\" + tn,\\n polygonOptions: {\\\"weight\\\":\\\"0.5\\\"},\\n maxClusterRadius: clusterRadius[map],\\n /* for the record. may be a function\\n function() {return (clusterRadius - 50) / 9 * Map[map].getZoom() + 50 - (clusterRadius - 50) / 9 },*/\\n iconCreateFunction: createCluster\\n });\\n } else {\\n fCluster[\\\"t\\\" + tn] = fCluster[map];\\n }\\n\\n // case 1 : data stored in a json tiddler\\n if (flds.type == \\\"application/json\\\") {\\n // for now, assuming any json stored data is geoJson...\\n var data = obj.wiki.getTiddlerText(tid);\\n mapGeoJson(data, feature, fCluster[\\\"t\\\" + tn], Colour[\\\"t\\\" + tn], mark, st);\\n feat.addLayer(feature);\\n }\\n // case 2 if tiddler is not JSON data, display tiddler stored geodata as point(s), polygon, polyline...\\n else {\\n // create the popup for base objects\\n popup = \\\"\u003Ch4>\u003Ca href=\\\\\\\"#\\\" + encodeURIComponent(flds.title) + \\\"\\\\\\\">\\\" + flds.title + \\\"\u003C/a>\u003C/h4>\\\";\\n var content = \\\"\\\";\\n if (flds.text !== \\\"\\\") {\\n // if tiddler contains a widget, avoid html rendering\\n if (flds.text.match(/\u003C\\\\$leafmap/)) {\\n content += \\\"\u003Cpre>\\\" + flds.text + \\\"\u003C/pre>\\\";\\n }\\n // else render\\n else {\\n content += obj.wiki.renderTiddler(\\\"text/html\\\", tid).substring(0, 420);\\n }\\n }\\n // adding a link to the tiddler\\n content += \\\"\u003Cbr/>(\u003Ca href=\\\\\\\"#\\\" + encodeURIComponent(flds.title) + \\\"\\\\\\\" title=\\\\\\\"read more...\\\\\\\">...\u003C/a>)\\\";\\n popup += content;\\n\\n // map recursively (!!! danger !!!)\\n mapPlaces(obj,\\n flds,\\n feature,\\n fCluster[\\\"t\\\" + tn],\\n popup,\\n cl,\\n mark,\\n st\\n );\\n feature.addTo(feat);\\n }\\n /*\\n// check if anything was rendered before binding popup\\n if (wasRendered == 0) console.log(\\\"tw-leaflet-map-plugin > non geotiddler was listed and not rendered : \\\" + flds.title);\\n // add the layer to the feature\\n feature.addLayer(subFeat);\\n feature.addTo(Map[map]); // layer.addTo(Map[map]);\\n } */\\n // get layer bounds for automatic zoom\\n extBounds(feature);\\n tn++;\\n }\\n // it tiddler rendered two many times for same map. Stoping and error launch\\n else $tw.utils.error(\\\"tiddler [[\\\" + tid + \\\"]] was rendered more than 4242 times in this map. Please double check circular dependencies...\\\");\\n }\\n\\n // map a tiddler collection\\n function mapTiddlers(obj, list, feat, clust, pop, col, mark, style) {\\n var Tids = list.split(\\\" \\\");\\n for (var td in Tids) {\\n mapTiddler(obj, Tids[td], feat, clust, pop, col, mark, style);\\n }\\n }\\n\\n // map tiddlers with a filter\\n function mapFilter(obj, filter, feat, clust, pop, col, mark, style) {\\n try {\\n var Tids = obj.wiki.filterTiddlers(filter);\\n for (var td in Tids) {\\n mapTiddler(obj, Tids[td], feat, clust, pop, col, mark, style);\\n }\\n } catch (error) {\\n $tw.utils.error(\\\"sorry there was something wrong when trying to map your filter. error : \\\" + error);\\n }\\n }\\n\\n // icon url creator\\n function iconUrl(col, tid, m) {\\n var icone = escape($tw.wiki.renderTiddler(\\\"text/html\\\", tid).replace(\\\"$primary$\\\", setColor(col, m)).replace(\\\"\u003C/p>\\\", \\\"\\\").replace(\\\"\u003Cp>\\\", \\\"\\\"));\\n return ('data:image/svg+xml;charset=UTF-8,' + icone);\\n }\\n\\n // create marker\\n // ?todo only if there are points to display;\\n function lfltIcon(col, tid, m) {\\n // checking if marker is defined. Fallback to default\\n if(tid === undefined || tid === null) tid = \\\"$:/plugins/sycom/leaflet/images/marker.svg\\\";\\n else tid = \\\"$:/plugins/sycom/leaflet/images/\\\" + tid + \\\".svg\\\";\\n if($tw.wiki.getTiddler(tid) === undefined) tid = \\\"$:/plugins/sycom/leaflet/images/marker.svg\\\";\\n // !todo create shadow from icon by transform matrix?\\n var shad = tid.split(\\\".svg\\\")[0] + \\\"shadow.svg\\\",\\n shadowUrl = 'data:image/svg+xml;charset=UTF-8,' + escape($tw.wiki.getTiddlerText(shad));\\n // get dimensions in tiddler\\n var MarkDim = $tw.wiki.getTiddler(tid).fields.marker_dim.split(\\\" \\\");\\n var ShadDim = $tw.wiki.getTiddler(shad).fields.marker_dim.split(\\\" \\\");\\n var theIcon = L.icon({\\n iconUrl: iconUrl(col, tid, m),\\n iconRetinaUrl: iconUrl(col, tid, m),\\n iconSize: [MarkDim[0], MarkDim[1]],\\n iconAnchor: [MarkDim[2], MarkDim[3]],\\n popupAnchor: [0, -MarkDim[3]],\\n shadowUrl: shadowUrl,\\n shadowRetinaUrl: shadowUrl,\\n shadowSize: [ShadDim[0], ShadDim[1]],\\n shadowAnchor: [ShadDim[2], ShadDim[3]]\\n });\\n return theIcon;\\n }\\n\\n // set color with fallback to map color or wiki...\\n function setColor(col, m) {\\n if(m === undefined) m = map;\\n if (col === undefined || col === null) col = Colour[m];\\n if (col === undefined || col === null) col = Colour.wiki;\\n return col;\\n }\\n\\n // set style with fallback to map color or wiki...\\n function checkStyle(sty, col) {\\n if (col === undefined || col === null) {\\n if(sty.color === undefined) sty.color = setColor(col, map);\\n if(sty.fillColor === undefined) sty.fillColor = setColor(col, map);\\n }\\n else {\\n sty.color = col;\\n sty.fillColor = col;\\n }\\n return sty;\\n }\\n\\n // coordinate error message\\n function displayError(objectType, error) {\\n $tw.utils.error(\\\"there was an error when mapping a \\\" + objectType + \\\" - error : \\\" + error);\\n }\\n\\n // adjust bounds to layer\\n function extBounds(feat) {\\n try {\\n if (bounds) {\\n bounds.extend(feat.getBounds());\\n } else {\\n if (feat.getBounds()._northEast) {\\n bounds = feat.getBounds();\\n }\\n }\\n } catch (error) {\\n $tw.utils.error(\\\"there was an error when trying to zoom on bounds. error : \\\" + error);\\n }\\n }\\n\\n // cluster icon creation\\n function createCluster(clust) {\\n // getting back map number\\n var m = this.name.split(\\\"Cluster\\\")[1],\\n t = this.name.split(\\\"Cluster\\\")[2],\\n zC = Map[m].getZoom(),\\n z0,cTot,cCol,cOpa;\\n // checking object density mean for the map\\n if (t === undefined) {\\n if (fCluster[m].z0 === undefined) fCluster[m].z0 = zC;\\n z0 = fCluster[m].z0;\\n if (fCluster[m].count === undefined) fCluster[m].count = 1;\\n cTot = fCluster[m].count;\\n cCol = setColor(Colour[m],m);\\n cOpa = 0.85\\n }\\n else {\\n if (fCluster[\\\"t\\\" + t].z0 === undefined) fCluster[\\\"t\\\" + t].z0 = zC;\\n z0 = fCluster[\\\"t\\\" + t].z0;\\n if (fCluster[\\\"t\\\" + t].count === undefined) fCluster[\\\"t\\\" + t].count = 1;\\n cTot = fCluster[\\\"t\\\" + t].count;\\n cCol = setColor(Colour[\\\"t\\\" + t],m);\\n cOpa = 0.65\\n }\\n // cluster icon size will be based on item number and zoom\\n // !todo: use density to get a more \\\"local\\\" percentage before calculating size\\n var cC = clust.getChildCount(),\\n cS = 20 * Math.log(clusterRadius[m]) * (1 + Math.log(cTot)/Math.max(cTot * Math.pow(2,zC-z0),Math.log(cTot))) * (1 - 1 / ((Math.log(cTot) / cTot) * Math.pow(2,zC-z0) * cC + 1));\\n if (cS \u003C 34) cS = 34;\\n var cF; // font size of cluster text\\n if (cC > 9999) cF = cS / 3;\\n else {if (cC > 999) cF = cS / 3.5;\\n else cF = cS / 2}\\n if (cF \u003C 12) cF = 12;\\n // creating icon. Checking tiddler or whole clustering before\\n return new L.DivIcon({\\n html: '\u003Cdiv style=\\\"width:' + cS + 'px;height:' + cS + 'px;font-size:' + cF + 'px;background-color:' + cCol + ';border-color:' + cCol + ';opacity:'+cOpa+'\\\">\u003Cdiv>\u003Cspan style=\\\"line-height:' + cS + 'px;opacity:'+(cOpa+0.12)+'\\\">' + cC + \\\"\u003C/span>\u003C/div>\u003C/div>\\\",\\n className: \\\"marker-cluster marker-cluster-\\\" + cC,\\n iconSize: new L.Point(cS, cS)\\n });\\n }\\n\\n // popup function for Json\\n function jsonPop(feat) {\\n // extracting data to create popup (all non-null data!)\\n var Prop = feat.properties,\\n jsontitle = \\\"\\\",\\n jsondesc = \\\"\\\",\\n jsonhtml = \\\"\\\";\\n // testing if properties title or name exists\\n if (Prop.name) jsontitle += Prop.name + \\\" \\\";\\n if (Prop.title) jsontitle += Prop.title + \\\" \\\";\\n if (Prop.description) jsondesc += Prop.description + \\\"\\\";\\n // populating other data\\n // if we got a title\\n if (jsontitle !== \\\"\\\") {\\n jsonhtml += \\\"\u003Ch4>\\\" + jsontitle + \\\"\u003C/h4>\\\";\\n // if we got a description let's give it\\n if (jsondesc !== \\\"\\\") jsonhtml += jsondesc;\\n else {\\n jsonhtml+= \\\"\u003Cul>\\\";\\n for (var p in Prop) {\\n if (Prop[p] !== null && Prop[p] !== \\\"\\\" && p != \\\"name\\\" && p != \\\"title\\\") jsonhtml += \\\"\u003Cli>\\\" + p + \\\" : \\\" + Prop[p] + \\\"\u003C/li>\\\";\\n }\\n jsonhtml += \\\"\u003C/ul>\\\";\\n }\\n }\\n // if we have no title, giving one with first fields\\n else {\\n // in case we've got a description. Stop after title\\n if (jsondesc !== \\\"\\\") {\\n for (var pr in Prop) {\\n // if title is really to short (as an id), taking next field\\n if (jsontitle.length \u003C 8) jsontitle += Prop[pr] + \\\" \\\";\\n else break;\\n }\\n jsonhtml = \\\"\u003Ch4>\\\" + jsontitle + \\\"\u003C/h4>\\\" + jsonhtml;\\n }\\n else {\\n for (var po in Prop) {\\n // if title is really to short (as an id), taking next field\\n if (jsontitle.length \u003C 4) jsontitle += Prop[po] + \\\" \\\";\\n else {\\n if (Prop[po] !== null && Prop[po] !== \\\"\\\") jsonhtml += \\\"\u003Cli>\\\" + po + \\\" : \\\" + Prop[po] + \\\"\u003C/li>\\\";\\n }\\n }\\n jsonhtml = \\\"\u003Ch4>\\\" + jsontitle + \\\"\u003C/h4>\u003Cul>\\\" + jsonhtml + \\\"\u003C/ul>\\\";\\n }\\n }\\n return jsonhtml;\\n }\\n\\n exports.leafmap = mapWidget;\\n\\n})();\\n/*\\nMISC NOTES for later\\nJSON.parse(tiddler.fields.text);\\nvar jsonData = this.wiki.getTiddlerAsJson(this.to),\\n*/\\n\",\n \"created\": \"20151028202401905\",\n \"modified\": \"20170318234011605\",\n \"type\": \"application/javascript\",\n \"module-type\": \"widget\"\n },\n \"$:/plugins/sycom/leaflet/readme\": {\n \"title\": \"$:/plugins/sycom/leaflet/readme\",\n \"text\": \"The [leaflet plugin](#$:/plugins/sycom/leaflet) is a work in progress integration of the [leaflet][leaflet] library in TiddlyWiki in order to display geographical purpose tiddlers.\\n\\nHave a look at [demo page on the web][plugindemo] or at integrated documentation which describes usage and examples.\\n\\nKeep in mind that the plugin might be buggy or imperfect. Please [report any comment or issue][issues] on main repo.\\n\\n## Sources / licenses\\n* [leaflet][leaflet] library (_1.3.1_) - License 2-clause BSD\\n * leaflet-[markerCluster][markercluster] extension - Licence MIT\\n* [leaflet plugin][source] is released under similar [BSD 3-Clause license][license] as TiddlyWiki.\\n!! Side projects\\n\\n[plugindemo]: https://sycom.gitlab.io/TiddlyWiki-Plugins/#Michel%20Strogoff%20from%20the%20sky\\n[source]: https://framagit.org/sycom/TiddlyWiki-Plugins/plugins/sycom/leaflet\\n[issues]: https://framagit.org/sycom/TiddlyWiki-Plugins/issues\\n[leaflet]: http://leafletjs.com/\\n[markercluster]: https://github.com/Leaflet/Leaflet.markercluster\\n[license]: https://framagit.org/sycom/TiddlyWiki-Plugins/LICENSE.md\\n\",\n \"type\": \"text/x-markdown\",\n \"created\": \"20151119173416000\",\n \"modified\": \"20190332172200000\",\n \"caption\": \"Readme\"\n },\n \"$:/plugins/sycom/leaflet/templates/geoTiddler\": {\n \"title\": \"$:/plugins/sycom/leaflet/templates/geoTiddler\",\n \"created\": \"20180602095702318\",\n \"modified\": \"20180602105242971\",\n \"tags\": \"$:/tags/ViewTemplate\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"\u003C$list filter=\\\"[all[current]has[point]] [all[current]has[points]] [all[current]has[polyline]] [all[current]has[polylines]] [all[current]has[polygon]] [all[current]has[polygons]] [all[current]has[places]] [all[current]has[geojson]]\\\">\\n \u003C$leafmap places='{\\\"tiddler\\\":\\\" \\\"}' height='240px'/>\\n\u003C/$list>\\n\"\n }\n }\n}","bag":"default","revision":"0","version":"0.8.6","type":"application/json","title":"$:/plugins/sycom/leaflet","source":"https://framagit.org/sycom/TiddlyWiki-Plugins","plugin-type":"plugin","list":"readme usage geoSyntax tileLayers markers example","description":"Leaflet maps","dependents":"","core-version":">=5.0.0","author":"Sylvain Comte","modified":"20231007121836978","tags":"$:/isAttachment $:/isEmbedded"}, {"created":"20231007124743310","title":"$:/SiteSubtitle","text":"a non-linear personal web notebook hosted on _ASTROPORT_","modified":"20231007125345452"}, {"created":"20231007124729483","title":"$:/SiteTitle","text":"My TiddlyWiki on Astroport","modified":"20231007133113146"}, +{"created":"20231007140354167","title":"$:/state/addplugins/tab-1342078386","text":"$:/config/TiddlyWiki-CPL/GitHub","modified":"20231007140354167"}, {"title":"$:/state/http-requests","text":"0"}, {"created":"20231007124549638","title":"$:/state/plugin-info-1935472218-$:/plugins/ipfs--1406793555","text":"contents","modified":"20231007124549638"}, {"created":"20231007125040460","title":"$:/state/sidebar","text":"yes","modified":"20231007125042121"}, {"created":"20231007133913097","title":"$:/state/tab--2112689675","text":"$:/core/ui/ControlPanel/Basics","modified":"20231007133917197"}, -{"created":"20231007121508028","title":"$:/state/tab-1749438307","text":"$:/core/ui/ControlPanel/Info","modified":"20231007124639815"}, +{"created":"20231007121508028","title":"$:/state/tab-1749438307","text":"$:/core/ui/ControlPanel/Plugins","modified":"20231007140350882"}, {"created":"20231007121510466","title":"$:/state/tab-2065006209","text":"$:/plugins/astroport/lightbeams/ControlPanel/Saving/Astroport :: Lightbeams","modified":"20231007124529021"}, {"created":"20231007122348727","title":"$:/state/tab/sidebar--595412856","text":"$:/core/ui/SideBar/Recent","modified":"20231007124803303"}, {"title":"$:/status/RequireReloadDueToPluginChange","text":"no"}, -{"title":"$:/StoryList","created":"20231007133432797","text":"","list":"GettingStarted","modified":"20231007134911498"}, +{"title":"$:/StoryList","created":"20231009074849180","text":"","list":"GettingStarted","modified":"20231009074850471"}, {"title":"$:/themes/tiddlywiki/snowwhite","name":"Snow White","author":"JeremyRuston","core-version":">=5.0.0","plugin-type":"theme","description":"Emphasises individual tiddlers","dependents":"$:/themes/tiddlywiki/vanilla","plugin-priority":"0","version":"5.3.1","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/tiddlywiki/snowwhite/base\":{\"title\":\"$:/themes/tiddlywiki/snowwhite/base\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\define sidebarbreakpoint-minus-one()\\n\u003C$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\\n\\\\end\\n\\n\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\\n\\n.tc-sidebar-header {\\n\\ttext-shadow: 0 1px 0 \u003C\u003Ccolour sidebar-foreground-shadow>>;\\n}\\n\\n.tc-tiddler-info {\\n\\t\u003C\u003Cbox-shadow \\\"inset 1px 2px 3px rgba(0,0,0,0.1)\\\">>\\n}\\n\\n@media screen {\\n\\t.tc-tiddler-frame {\\n\\t\\t\u003C\u003Cbox-shadow \\\"1px 1px 5px rgba(0, 0, 0, 0.3)\\\">>\\n\\t}\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\t.tc-tiddler-frame {\\n\\t\\t\u003C\u003Cbox-shadow none>>\\n\\t}\\n}\\n\\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\\n\\t\u003C\u003Ctransition \\\"fill 150ms ease-in-out\\\">>\\n}\\n\\n.tc-tiddler-controls button.tc-selected,\\n.tc-page-controls button.tc-selected {\\n\\t\u003C\u003Cfilter \\\"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\\\">>\\n}\\n\\n.tc-tiddler-frame input.tc-edit-texteditor,\\n.tc-tiddler-frame select.tc-edit-texteditor {\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 8px rgba(0, 0, 0, 0.15)\\\">>\\n}\\n\\n.tc-edit-tags {\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 8px rgba(0, 0, 0, 0.15)\\\">>\\n}\\n\\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\\n\\t\u003C\u003Cbox-shadow \\\"none\\\">>\\n\\tborder: none;\\n\\toutline: none;\\n}\\n\\ntextarea.tc-edit-texteditor {\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\\n}\\n\\ncanvas.tc-edit-bitmapeditor {\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 5px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-drop-down {\\n\\tborder-radius: 4px;\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 10px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-block-dropdown {\\n\\tborder-radius: 4px;\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 10px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-modal {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.3)\\\">>\\n}\\n\\n.tc-modal-footer {\\n\\tborder-radius: 0 0 6px 6px;\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 0 #fff\\\">>;\\n}\\n\\n\\n.tc-alert {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.6)\\\">>\\n}\\n\\n.tc-notification {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.3)\\\">>\\n\\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\\n}\\n\\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\\n\\tborder-top: none;\\n\\theight: 1px;\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\\\">>\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\\\">>\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\\\">>\\n}\\n\\n.tc-message-box img {\\n\\t\u003C\u003Cbox-shadow \\\"1px 1px 3px rgba(0,0,0,0.5)\\\">>\\n}\\n\\n.tc-plugin-info {\\n\\t\u003C\u003Cbox-shadow \\\"1px 1px 3px rgba(0,0,0,0.5)\\\">>\\n}\\n\"}}}"}, {"title":"$:/themes/tiddlywiki/vanilla","name":"Vanilla","author":"JeremyRuston","core-version":">=5.0.0","plugin-type":"theme","description":"Basic theme","plugin-priority":"0","version":"5.3.1","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/tiddlywiki/vanilla/themetweaks\":{\"title\":\"$:/themes/tiddlywiki/vanilla/themetweaks\",\"tags\":\"$:/tags/ControlPanel/Appearance\",\"caption\":\"{{$:/language/ThemeTweaks/ThemeTweaks}}\",\"text\":\"\\\\define lingo-base() $:/language/ThemeTweaks/\\n\\n\\\\define replacement-text()\\n[img[$(imageTitle)$]]\\n\\\\end\\n\\n\\\\define backgroundimage-dropdown()\\n\u003Cdiv class=\\\"tc-drop-down-wrapper\\\">\\n\u003C$set name=\\\"state\\\" value=\u003C\u003Cqualify \\\"$:/state/popup/themetweaks/backgroundimage\\\">>>\\n\u003C$button popup=\u003C\u003Cstate>> class=\\\"tc-btn-invisible tc-btn-dropdown\\\">{{$:/core/images/down-arrow}}\u003C/$button>\\n\u003C$reveal state=\u003C\u003Cstate>> type=\\\"popup\\\" position=\\\"belowleft\\\" text=\\\"\\\" default=\\\"\\\" class=\\\"tc-popup-keep\\\">\\n\u003Cdiv class=\\\"tc-drop-down\\\" style=\\\"text-align:center;\\\">\\n\u003C$macrocall $name=\\\"image-picker\\\" actions=\\\"\\\"\\\"\\n\\n\u003C$action-setfield\\n\\t$tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\\\"\\n\\t$value=\u003C\u003CimageTitle>>\\n/>\\n\\n\u003C$action-deletetiddler $tiddler=\u003C\u003Cstate>>/>\\n\\n\\\"\\\"\\\"/>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003C/$set>\\n\u003C/div>\\n\\\\end\\n\\n\\\\define backgroundimageattachment-dropdown()\\n\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\\\" default=\\\"scroll\\\">\\n\u003Coption value=\\\"scroll\\\">\u003C\u003Clingo Settings/BackgroundImageAttachment/Scroll>>\u003C/option>\\n\u003Coption value=\\\"fixed\\\">\u003C\u003Clingo Settings/BackgroundImageAttachment/Fixed>>\u003C/option>\\n\u003C/$select>\\n\\\\end\\n\\n\\\\define backgroundimagesize-dropdown()\\n\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\\\" default=\\\"scroll\\\">\\n\u003Coption value=\\\"auto\\\">\u003C\u003Clingo Settings/BackgroundImageSize/Auto>>\u003C/option>\\n\u003Coption value=\\\"cover\\\">\u003C\u003Clingo Settings/BackgroundImageSize/Cover>>\u003C/option>\\n\u003Coption value=\\\"contain\\\">\u003C\u003Clingo Settings/BackgroundImageSize/Contain>>\u003C/option>\\n\u003C/$select>\\n\\\\end\\n\\n\u003C\u003Clingo ThemeTweaks/Hint>>\\n\\n! \u003C\u003Clingo Options>>\\n\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\\\">\u003C\u003Clingo Options/SidebarLayout>>\u003C/$link> |\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\\\">\u003Coption value=\\\"fixed-fluid\\\">\u003C\u003Clingo Options/SidebarLayout/Fixed-Fluid>>\u003C/option>\u003Coption value=\\\"fluid-fixed\\\">\u003C\u003Clingo Options/SidebarLayout/Fluid-Fixed>>\u003C/option>\u003C/$select> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/options/stickytitles\\\">\u003C\u003Clingo Options/StickyTitles>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Options/StickyTitles/Hint>>// |\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/options/stickytitles\\\">\u003Coption value=\\\"no\\\">{{$:/language/No}}\u003C/option>\u003Coption value=\\\"yes\\\">{{$:/language/Yes}}\u003C/option>\u003C/$select> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/options/codewrapping\\\">\u003C\u003Clingo Options/CodeWrapping>>\u003C/$link> |\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/options/codewrapping\\\">\u003Coption value=\\\"pre\\\">{{$:/language/No}}\u003C/option>\u003Coption value=\\\"pre-wrap\\\">{{$:/language/Yes}}\u003C/option>\u003C/$select> |\\n\\n! \u003C\u003Clingo Settings>>\\n\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\\\">\u003C\u003Clingo Settings/FontFamily>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\\\" default=\\\"\\\" tag=\\\"input\\\"/> | |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\\\">\u003C\u003Clingo Settings/CodeFontFamily>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\\\" default=\\\"\\\" tag=\\\"input\\\"/> | |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\\\">\u003C\u003Clingo Settings/EditorFontFamily>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\\\" default=\\\"\\\" tag=\\\"input\\\"/> | |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\\\">\u003C\u003Clingo Settings/BackgroundImage>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\u003C\u003Cbackgroundimage-dropdown>> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\\\">\u003C\u003Clingo Settings/BackgroundImageAttachment>>\u003C/$link> |\u003C\u003Cbackgroundimageattachment-dropdown>> | |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\\\">\u003C\u003Clingo Settings/BackgroundImageSize>>\u003C/$link> |\u003C\u003Cbackgroundimagesize-dropdown>> | |\\n\\n! \u003C\u003Clingo Metrics>>\\n\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\\\">\u003C\u003Clingo Metrics/FontSize>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\\\">\u003C\u003Clingo Metrics/LineHeight>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\\\">\u003C\u003Clingo Metrics/BodyFontSize>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\\\">\u003C\u003Clingo Metrics/BodyLineHeight>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\\\">\u003C\u003Clingo Metrics/StoryLeft>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/StoryLeft/Hint>>// |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/storytop\\\">\u003C\u003Clingo Metrics/StoryTop>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/StoryTop/Hint>>// |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/storytop\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/storyright\\\">\u003C\u003Clingo Metrics/StoryRight>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/StoryRight/Hint>>// |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/storyright\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\\\">\u003C\u003Clingo Metrics/StoryWidth>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/StoryWidth/Hint>>// |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\\\">\u003C\u003Clingo Metrics/TiddlerWidth>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/TiddlerWidth/Hint>>//\u003Cbr> |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\\\">\u003C\u003Clingo Metrics/SidebarBreakpoint>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/SidebarBreakpoint/Hint>>// |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\\\">\u003C\u003Clingo Metrics/SidebarWidth>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Metrics/SidebarWidth/Hint>>// |^\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n\"},\"$:/themes/tiddlywiki/vanilla/base\":{\"title\":\"$:/themes/tiddlywiki/vanilla/base\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"code-body\":\"yes\",\"text\":\"\\\\define custom-background-datauri()\\n\u003C$set name=\\\"background\\\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\\n\u003C$list filter=\\\"[\u003Cbackground>is[image]]\\\">\\n`background: url(`\\n\u003C$list filter=\\\"[\u003Cbackground>!has[_canonical_uri]]\\\">\\n`\\\"`\u003C$macrocall $name=\\\"datauri\\\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>`\\\"`\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Cbackground>has[_canonical_uri]]\\\">\\n`\\\"`\u003C$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\\\"_canonical_uri\\\"/>`\\\"`\\n\u003C/$list>\\n`) center center;`\\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\\n\u003C/$list>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define sidebarbreakpoint()\\n\u003C$text text={{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}/>\\n\\\\end\\n\\n\\\\define sidebarbreakpoint-minus-one()\\n\u003C$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\\n\\\\end\\n\\n\\\\define if-fluid-fixed(text,hiddenSidebarText)\\n\u003C$reveal state=\\\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\\\" type=\\\"match\\\" text=\\\"fluid-fixed\\\">\\n$text$\\n\u003C$reveal state=\\\"$:/state/sidebar\\\" type=\\\"nomatch\\\" text=\\\"yes\\\" default=\\\"yes\\\">\\n$hiddenSidebarText$\\n\u003C/$reveal>\\n\u003C/$reveal>\\n\\\\end\\n\\n\\\\define if-editor-height-fixed(then,else)\\n\u003C$reveal state=\\\"$:/config/TextEditor/EditorHeight/Mode\\\" type=\\\"match\\\" text=\\\"fixed\\\">\\n$then$\\n\u003C/$reveal>\\n\u003C$reveal state=\\\"$:/config/TextEditor/EditorHeight/Mode\\\" type=\\\"match\\\" text=\\\"auto\\\">\\n$else$\\n\u003C/$reveal>\\n\\\\end\\n\\n\\\\define set-type-selector-min-width()\\n\u003C$set name=\\\"typeLength\\\" value={{{ [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]get[name]length[]maxall[]] }}}>\\n\\n\\t.tc-type-selector-dropdown-wrapper {\\n\\t\\tmin-width: calc(\u003C\u003CtypeLength>>ch + 4em);\\n\\t}\\n\\n\\t.tc-type-selector-dropdown-wrapper input.tc-edit-typeeditor {\\n\\t\\tmin-width: \u003C\u003CtypeLength>>ch;\\n\\t}\\n\\n\u003C/$set>\\n\\\\end\\n\\n\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\\n\\n/*\\n** Start with the normalize CSS reset, and then belay some of its effects\\n*/\\n\\n{{$:/themes/tiddlywiki/vanilla/reset}}\\n\\n*, input[type=\\\"search\\\"] {\\n\\tbox-sizing: border-box;\\n\\t-moz-box-sizing: border-box;\\n\\t-webkit-box-sizing: border-box;\\n}\\n\\n/*\\n** Button default styles. Makes them look consistent for all browsers\\n*/\\nhtml button {\\n\\tline-height: 1.2;\\n\\tcolor: \u003C\u003Ccolour button-foreground>>;\\n\\tfill: \u003C\u003Ccolour button-foreground>>;\\n\\tbackground: \u003C\u003Ccolour button-background>>;\\n\\tborder-color: \u003C\u003Ccolour button-border>>;\\n}\\n\\nbutton:disabled svg {\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n/*\\n** Basic element styles\\n*/\\n\\nhtml, body {\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\\n\\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\\n\\t-webkit-font-smoothing: antialiased;\\n\\t-moz-osx-font-smoothing: grayscale;\\n}\\n\\nhtml:-webkit-full-screen {\\n\\tbackground-color: \u003C\u003Ccolour page-background>>;\\n}\\n\\nbody.tc-body {\\n\\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\\n\\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\\n\\tword-wrap: break-word;\\n\\t\u003C\u003Ccustom-background-datauri>>\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tbackground-color: \u003C\u003Ccolour page-background>>;\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n}\\n\\n\u003C\u003Cif-background-attachment \\\"\\\"\\\"\\n\\nbody.tc-body {\\n\\tbackground-color: transparent;\\n}\\n\\n\\\"\\\"\\\">>\\n\\n/**\\n * Correct the font size and margin on `h1` elements within `section` and\\n * `article` contexts in Chrome, Firefox, and Safari.\\n */\\n\\nh1 {\\n\\tfont-size: 2em;\\n}\\n\\nh1, h2, h3, h4, h5, h6 {\\n\\tline-height: 1.2;\\n\\tfont-weight: normal;\\n}\\n\\npre {\\n\\tdisplay: block;\\n\\tmargin-top: 1em;\\n\\tmargin-bottom: 1em;\\n\\tword-break: normal;\\n\\tword-wrap: break-word;\\n\\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\\n\\tbackground-color: \u003C\u003Ccolour pre-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour pre-border>>;\\n\\tpadding: 0 3px 2px;\\n\\tborder-radius: 3px;\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\\n}\\n\\ncode {\\n\\tcolor: \u003C\u003Ccolour code-foreground>>;\\n\\tbackground-color: \u003C\u003Ccolour code-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour code-border>>;\\n\\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\\n\\tpadding: 0 3px 2px;\\n\\tborder-radius: 3px;\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\\n}\\n\\nblockquote {\\n\\tborder-left: 5px solid \u003C\u003Ccolour blockquote-bar>>;\\n\\tmargin-left: 25px;\\n\\tpadding-left: 10px;\\n\\tquotes: \\\"\\\\201C\\\"\\\"\\\\201D\\\"\\\"\\\\2018\\\"\\\"\\\\2019\\\";\\n}\\n\\nblockquote > div {\\n\\tmargin-top: 1em;\\n\\tmargin-bottom: 1em;\\n}\\n\\nblockquote.tc-big-quote {\\n\\tfont-family: Georgia, serif;\\n\\tposition: relative;\\n\\tbackground: \u003C\u003Ccolour pre-background>>;\\n\\tborder-left: none;\\n\\tmargin-left: 50px;\\n\\tmargin-right: 50px;\\n\\tpadding: 10px;\\n\\tborder-radius: 8px;\\n}\\n\\nblockquote.tc-big-quote cite:before {\\n\\tcontent: \\\"\\\\2014 \\\\2009\\\";\\n}\\n\\nblockquote.tc-big-quote:before {\\n\\tfont-family: Georgia, serif;\\n\\tcolor: \u003C\u003Ccolour blockquote-bar>>;\\n\\tcontent: open-quote;\\n\\tfont-size: 8em;\\n\\tline-height: 0.1em;\\n\\tmargin-right: 0.25em;\\n\\tvertical-align: -0.4em;\\n\\tposition: absolute;\\n\\tleft: -50px;\\n\\ttop: 42px;\\n}\\n\\nblockquote.tc-big-quote:after {\\n\\tfont-family: Georgia, serif;\\n\\tcolor: \u003C\u003Ccolour blockquote-bar>>;\\n\\tcontent: close-quote;\\n\\tfont-size: 8em;\\n\\tline-height: 0.1em;\\n\\tmargin-right: 0.25em;\\n\\tvertical-align: -0.4em;\\n\\tposition: absolute;\\n\\tright: -80px;\\n\\tbottom: -20px;\\n}\\n\\ndl dt {\\n\\tfont-weight: bold;\\n\\tmargin-top: 6px;\\n}\\n\\ntextarea,\\ninput[type=text],\\ninput[type=search],\\ninput[type=\\\"\\\"],\\ninput:not([type]) {\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n}\\n\\ninput[type=\\\"checkbox\\\"] {\\n\\tvertical-align: middle;\\n}\\n\\ninput[type=\\\"search\\\"]::-webkit-search-decoration,\\ninput[type=\\\"search\\\"]::-webkit-search-cancel-button,\\ninput[type=\\\"search\\\"]::-webkit-search-results-button,\\ninput[type=\\\"search\\\"]::-webkit-search-results-decoration {\\n\\t-webkit-appearance:none;\\n}\\n\\n.tc-muted {\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\nsvg.tc-image-button {\\n\\tpadding: 0px 1px 1px 0px;\\n}\\n\\n.tc-icon-wrapper > svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n}\\n\\nkbd {\\n\\tdisplay: inline-block;\\n\\tpadding: 3px 5px;\\n\\tfont-size: 0.8em;\\n\\tline-height: 1.2;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tvertical-align: middle;\\n\\tbackground-color: \u003C\u003Ccolour background>>;\\n\\tborder: solid 1px \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-bottom-color: \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-radius: 3px;\\n\\tbox-shadow: inset 0 -1px 0 \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n::selection {\\n\\tbackground-color: Highlight;\\n\\tcolor: HighlightText;\\n\\tbackground-color: \u003C\u003Ccolour selection-background>>;\\n\\tcolor: \u003C\u003Ccolour selection-foreground>>;\\n}\\n\\n.tc-inline-style {\\n\\tbackground: \u003C\u003Ccolour highlight-background>>;\\n\\tcolor: \u003C\u003Ccolour highlight-foreground>>;\\n}\\n\\nform.tc-form-inline {\\n\\tdisplay: inline;\\n}\\n\\n/*\\nMarkdown likes putting code elements inside pre elements\\n*/\\npre > code {\\n\\tpadding: 0;\\n\\tborder: none;\\n\\tbackground-color: inherit;\\n\\tcolor: inherit;\\n}\\n\\n/*\\nTable defaults\\n*/\\n\\ntable {\\n\\tborder: 1px solid \u003C\u003Ccolour table-border>>;\\n\\twidth: auto;\\n\\tmax-width: 100%;\\n\\tcaption-side: bottom;\\n\\tmargin-top: 1em;\\n\\tmargin-bottom: 1em;\\n\\t/* next 2 elements needed, since normalize 8.0.1 */\\n\\tborder-collapse: collapse;\\n\\tborder-spacing: 0;\\n}\\n\\ntable th, table td {\\n\\tpadding: 0 7px 0 7px;\\n\\tborder-top: 1px solid \u003C\u003Ccolour table-border>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour table-border>>;\\n}\\n\\ntable thead tr td, table th {\\n\\tbackground-color: \u003C\u003Ccolour table-header-background>>;\\n\\tfont-weight: bold;\\n}\\n\\ntable tfoot tr td {\\n\\tbackground-color: \u003C\u003Ccolour table-footer-background>>;\\n}\\n\\n/*\\nTable utility classes\\n*/\\n\\n/* Remove borders from table as used in eg: GettingStarted*/\\n.tc-table-no-border,\\n.tc-table-no-border th,\\n.tc-table-no-border td {\\n\\tborder: initial;\\n}\\n\\n/* First column in table width will fit to text.*/\\n/* This rule makes most sense with tc-first-link-nowrap*/\\n.tc-first-col-min-width td:nth-child(1) {\\n\\twidth: 1%;\\n}\\n\\n/*\\n** Utility classes work well with tables but also for other containers\\n*/\\n\\n/* First link A element will not wrap */\\n.tc-first-link-nowrap:first-of-type a {\\n\\twhite-space: nowrap;\\n}\\n\\n/* Move the table to the center of the container */\\n.tc-center {\\n\\tmargin-left: auto;\\n\\tmargin-right: auto;\\n}\\n\\n.tc-max-width {\\n\\twidth: 100%;\\n}\\n\\n.tc-max-width-80 {\\n\\tmax-width: 80%;\\n}\\n\\n/* Allow input and textarea to look like the ControlPanel inputs */\\n.tc-edit-max-width input,\\n.tc-edit-max-width textarea {\\n\\twidth: 100%;\\n\\tpadding: 3px;\\n}\\n\\n/*\\nCSV parser plugin\\n*/\\n\\n.tc-csv-table {\\n\\twhite-space: nowrap;\\n}\\n\\n.tc-csv-table th,\\n.tc-csv-table td {\\n\\twhite-space: pre-line;\\n}\\n\\n/*\\nTiddler frame in story river\\n*/\\n\\n.tc-tiddler-frame img,\\n.tc-tiddler-frame svg,\\n.tc-tiddler-frame canvas,\\n.tc-tiddler-frame embed,\\n.tc-tiddler-frame iframe {\\n\\tmax-width: 100%;\\n}\\n\\n.tc-tiddler-body > embed,\\n.tc-tiddler-body > iframe {\\n\\twidth: 100%;\\n\\theight: 600px;\\n}\\n\\n:root {\\n\\tcolor-scheme: {{{ [{$:/palette}get[color-scheme]] ~light }}};\\n}\\n\\n/*\\n** Links\\n*/\\n\\nbutton.tc-tiddlylink,\\na.tc-tiddlylink {\\n\\ttext-decoration: none;\\n\\tfont-weight: 500;\\n\\tcolor: \u003C\u003Ccolour tiddler-link-foreground>>;\\n\\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\\n\\t-webkit-touch-callout: none; /* Prevents long presses from bringing up a link preview */\\n}\\n\\n.tc-sidebar-lists a.tc-tiddlylink {\\n\\tcolor: \u003C\u003Ccolour sidebar-tiddler-link-foreground>>;\\n}\\n\\n.tc-sidebar-lists a.tc-tiddlylink:hover {\\n\\tcolor: \u003C\u003Ccolour sidebar-tiddler-link-foreground-hover>>;\\n}\\n\\nbutton.tc-tiddlylink:hover,\\na.tc-tiddlylink:hover {\\n\\ttext-decoration: underline;\\n}\\n\\na.tc-tiddlylink-resolves {\\n}\\n\\na.tc-tiddlylink-shadow {\\n\\tfont-weight: bold;\\n}\\n\\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\\n\\tfont-weight: normal;\\n}\\n\\na.tc-tiddlylink-missing {\\n\\tfont-style: italic;\\n}\\n\\na.tc-tiddlylink-external {\\n\\ttext-decoration: underline;\\n\\tcolor: \u003C\u003Ccolour external-link-foreground>>;\\n\\tbackground-color: \u003C\u003Ccolour external-link-background>>;\\n}\\n\\na.tc-tiddlylink-external:visited {\\n\\tcolor: \u003C\u003Ccolour external-link-foreground-visited>>;\\n\\tbackground-color: \u003C\u003Ccolour external-link-background-visited>>;\\n}\\n\\na.tc-tiddlylink-external:hover {\\n\\tcolor: \u003C\u003Ccolour external-link-foreground-hover>>;\\n\\tbackground-color: \u003C\u003Ccolour external-link-background-hover>>;\\n}\\n\\n.tc-drop-down a.tc-tiddlylink:hover {\\n\\tcolor: \u003C\u003Ccolour tiddler-link-background>>;\\n}\\n\\n/*\\n** Drag and drop styles\\n*/\\n\\n.tc-tiddler-dragger {\\n\\tposition: relative;\\n\\tz-index: -10000;\\n}\\n\\n.tc-tiddler-dragger-inner {\\n\\tposition: absolute;\\n\\ttop: -1000px;\\n\\tleft: -1000px;\\n\\tdisplay: inline-block;\\n\\tpadding: 8px 20px;\\n\\tfont-size: 16.9px;\\n\\tfont-weight: bold;\\n\\tline-height: 20px;\\n\\tcolor: \u003C\u003Ccolour dragger-foreground>>;\\n\\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\\n\\twhite-space: nowrap;\\n\\tvertical-align: baseline;\\n\\tbackground-color: \u003C\u003Ccolour dragger-background>>;\\n\\tborder-radius: 20px;\\n}\\n\\n.tc-tiddler-dragger-cover {\\n\\tposition: absolute;\\n\\tbackground-color: \u003C\u003Ccolour page-background>>;\\n}\\n\\n.tc-page-container > .tc-dropzone {\\n\\tmin-height: 100vh;\\n}\\n\\n.tc-dropzone {\\n\\tposition: relative;\\n}\\n\\n.tc-dropzone.tc-dragover:before {\\n\\tz-index: 10000;\\n\\tdisplay: block;\\n\\tposition: fixed;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tbackground: \u003C\u003Ccolour dropzone-background>>;\\n\\ttext-align: center;\\n\\tcontent: \\\"\u003C\u003Clingo DropMessage>>\\\";\\n}\\n\\n.tc-droppable > .tc-droppable-placeholder {\\n\\tdisplay: none;\\n}\\n\\n.tc-droppable.tc-dragover > .tc-droppable-placeholder {\\n\\tdisplay: block;\\n\\tborder: 2px dashed \u003C\u003Ccolour dropzone-background>>;\\n}\\n\\n.tc-draggable {\\n\\tcursor: move;\\n}\\n\\n.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,\\n.tc-links-draggable-list .tc-droppable-placeholder {\\n\\tline-height: 2em;\\n\\theight: 2em;\\n}\\n\\n.tc-sidebar-tab-open-item {\\n\\tposition: relative;\\n}\\n\\n.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {\\n\\tfont-size: 0.7em;\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n/*\\n** Plugin reload warning\\n*/\\n\\n.tc-plugin-reload-warning {\\n\\tz-index: 1000;\\n\\tdisplay: block;\\n\\tposition: fixed;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tbackground: \u003C\u003Ccolour alert-background>>;\\n\\ttext-align: center;\\n}\\n\\n/*\\n** Buttons\\n*/\\n\\nbutton svg, button img, label svg, label img {\\n\\tvertical-align: middle;\\n}\\n\\n.tc-btn-invisible {\\n\\tpadding: 0;\\n\\tmargin: 0;\\n\\tbackground: none;\\n\\tborder: none;\\n\\tcursor: pointer;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n}\\n\\nbutton:disabled.tc-btn-invisible {\\n\\tcursor: default;\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-btn-boxed {\\n\\tfont-size: 0.6em;\\n\\tpadding: 0.2em;\\n\\tmargin: 1px;\\n\\tbackground: none;\\n\\tborder: 1px solid \u003C\u003Ccolour tiddler-controls-foreground>>;\\n\\tborder-radius: 0.25em;\\n}\\n\\nhtml body.tc-body .tc-btn-boxed svg {\\n\\tfont-size: 1.6666em;\\n}\\n\\n.tc-btn-boxed:hover {\\n\\tbackground: \u003C\u003Ccolour muted-foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n}\\n\\nhtml body.tc-body .tc-btn-boxed:hover svg {\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-btn-rounded {\\n\\tfont-size: 0.5em;\\n\\tline-height: 2;\\n\\tpadding: 0em 0.3em 0.2em 0.4em;\\n\\tmargin: 1px;\\n\\tborder: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tbackground: \u003C\u003Ccolour muted-foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tborder-radius: 2em;\\n}\\n\\nhtml body.tc-body .tc-btn-rounded svg {\\n\\tfont-size: 1.6666em;\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-btn-rounded:hover {\\n\\tborder: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\nhtml body.tc-body .tc-btn-rounded:hover svg {\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-btn-icon svg {\\n\\theight: 1em;\\n\\twidth: 1em;\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n\\n.tc-btn-text {\\n\\tmargin-left: 7px;\\n}\\n\\n/* used for documentation \\\"fake\\\" buttons */\\n.tc-btn-standard {\\n\\tline-height: 1.8;\\n\\tcolor: #667;\\n\\tbackground-color: #e0e0e0;\\n\\tborder: 1px solid #888;\\n\\tpadding: 2px 1px 2px 1px;\\n\\tmargin: 1px 4px 1px 4px;\\n}\\n\\n.tc-btn-big-green {\\n\\tdisplay: inline-block;\\n\\tpadding: 8px;\\n\\tmargin: 4px 8px 4px 8px;\\n\\tbackground: \u003C\u003Ccolour download-background>>;\\n\\tcolor: \u003C\u003Ccolour download-foreground>>;\\n\\tfill: \u003C\u003Ccolour download-foreground>>;\\n\\tborder: none;\\n\\tborder-radius: 2px;\\n\\tfont-size: 1.2em;\\n\\tline-height: 1.4em;\\n\\ttext-decoration: none;\\n}\\n\\n.tc-btn-big-green svg,\\n.tc-btn-big-green img {\\n\\theight: 2em;\\n\\twidth: 2em;\\n\\tvertical-align: middle;\\n\\tfill: \u003C\u003Ccolour download-foreground>>;\\n}\\n\\n.tc-primary-btn {\\n\\tbackground: \u003C\u003Ccolour primary>>;\\n}\\n\\n.tc-sidebar-lists input {\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-sidebar-lists button {\\n\\tcolor: \u003C\u003Ccolour sidebar-button-foreground>>;\\n\\tfill: \u003C\u003Ccolour sidebar-button-foreground>>;\\n}\\n\\n.tc-sidebar-lists button.tc-btn-mini {\\n\\tcolor: \u003C\u003Ccolour sidebar-muted-foreground>>;\\n}\\n\\n.tc-sidebar-lists button.tc-btn-mini:hover {\\n\\tcolor: \u003C\u003Ccolour sidebar-muted-foreground-hover>>;\\n}\\n\\n.tc-sidebar-lists button small {\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n}\\n\\nbutton svg.tc-image-button, button .tc-image-button img {\\n\\theight: 1em;\\n\\twidth: 1em;\\n}\\n\\n.tc-unfold-banner {\\n\\tposition: absolute;\\n\\tpadding: 0;\\n\\tmargin: 0;\\n\\tbackground: none;\\n\\tborder: none;\\n\\twidth: 100%;\\n\\twidth: calc(100% + 2px);\\n\\tmargin-left: -43px;\\n\\ttext-align: center;\\n\\tborder-top: 2px solid \u003C\u003Ccolour tiddler-info-background>>;\\n\\tmargin-top: 4px;\\n}\\n\\n.tc-unfold-banner:hover {\\n\\tbackground: \u003C\u003Ccolour tiddler-info-background>>;\\n\\tborder-top: 2px solid \u003C\u003Ccolour tiddler-info-border>>;\\n}\\n\\n.tc-unfold-banner svg, .tc-fold-banner svg {\\n\\theight: 0.75em;\\n\\tfill: \u003C\u003Ccolour tiddler-controls-foreground>>;\\n}\\n\\n.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {\\n\\tfill: \u003C\u003Ccolour tiddler-controls-foreground-hover>>;\\n}\\n\\n.tc-fold-banner {\\n\\tposition: absolute;\\n\\tpadding: 0;\\n\\tmargin: 0;\\n\\tbackground: none;\\n\\tborder: none;\\n\\twidth: 23px;\\n\\ttext-align: center;\\n\\tmargin-left: -35px;\\n\\ttop: 6px;\\n\\tbottom: 6px;\\n}\\n\\n.tc-fold-banner:hover {\\n\\tbackground: \u003C\u003Ccolour tiddler-info-background>>;\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\t.tc-unfold-banner {\\n\\t\\tposition: static;\\n\\t\\twidth: calc(100% + 59px);\\n\\t}\\n\\n\\t.tc-fold-banner {\\n\\t\\twidth: 16px;\\n\\t\\tmargin-left: -16px;\\n\\t\\tfont-size: 0.75em;\\n\\t}\\n\\n}\\n\\n/*\\n** Tags and missing tiddlers\\n*/\\n\\n.tc-tag-list-item {\\n\\tposition: relative;\\n\\tdisplay: inline-block;\\n}\\n\\n.tc-tags-wrapper {\\n\\tmargin: 4px 0 14px 0;\\n}\\n\\n.tc-tags-wrapper .tc-tag-list-item {\\n\\tmargin-right: 7px;\\n}\\n\\n.tc-missing-tiddler-label {\\n\\tfont-style: italic;\\n\\tfont-weight: normal;\\n\\tdisplay: inline-block;\\n\\tfont-size: 11.844px;\\n\\tline-height: 14px;\\n\\twhite-space: nowrap;\\n\\tvertical-align: baseline;\\n}\\n\\n.tc-block-tags-dropdown > .tc-btn-invisible:hover {\\n\\tbackground-color: \u003C\u003Ccolour primary>>;\\n}\\n\\nbutton.tc-tag-label, span.tc-tag-label {\\n\\tdisplay: inline-block;\\n\\tpadding: 0.16em 0.7em;\\n\\tfont-size: 0.9em;\\n\\tfont-weight: normal;\\n\\tline-height: 1.2em;\\n\\tcolor: \u003C\u003Ccolour tag-foreground>>;\\n\\twhite-space: break-spaces;\\n\\tvertical-align: baseline;\\n\\tbackground-color: \u003C\u003Ccolour tag-background>>;\\n\\tborder-radius: 1em;\\n}\\n\\n.tc-sidebar-scrollable .tc-tag-label {\\n\\ttext-shadow: none;\\n}\\n\\n.tc-untagged-separator {\\n\\tborder: 0;\\n\\theight: 1px;\\n\\tbackground: \u003C\u003Ccolour tab-divider>>;\\n}\\n\\nbutton.tc-untagged-label {\\n\\tbackground-color: \u003C\u003Ccolour untagged-background>>;\\n}\\n\\n.tc-tag-label svg, .tc-tag-label img {\\n\\theight: 1em;\\n\\twidth: 1em;\\n\\tmargin-right: 3px;\\n\\tmargin-bottom: 1px;\\n\\tvertical-align: bottom;\\n}\\n\\n.tc-edit-tags button.tc-remove-tag-button svg {\\n\\tfont-size: 0.7em;\\n\\tvertical-align: middle;\\n}\\n\\n.tc-tag-manager-table .tc-tag-label {\\n}\\n\\n.tc-tag-manager-tag {\\n\\twidth: 100%;\\n}\\n\\nbutton.tc-btn-invisible.tc-remove-tag-button {\\n\\toutline: none;\\n}\\n\\n.tc-tag-button-selected,\\n.tc-list-item-selected a.tc-tiddlylink, a.tc-list-item-selected {\\n\\tbackground-color: \u003C\u003Ccolour primary>>;\\n\\tcolor: \u003C\u003Ccolour tiddler-background>>;\\n}\\n\\n/*\\n** Page layout\\n*/\\n\\n.tc-topbar {\\n\\tposition: fixed;\\n\\tz-index: 1200;\\n}\\n\\n.tc-topbar-left {\\n\\tleft: 29px;\\n\\ttop: 5px;\\n}\\n\\n.tc-topbar-right {\\n\\ttop: 5px;\\n\\tright: 29px;\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\t.tc-topbar-right {\\n\\t\\tright: 10px;\\n\\t}\\n\\n}\\n\\n.tc-topbar button {\\n\\tpadding: 8px;\\n}\\n\\n.tc-topbar svg {\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-topbar button:hover svg {\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\t.tc-show-sidebar-btn svg.tc-image-chevron-left, .tc-hide-sidebar-btn svg.tc-image-chevron-right {\\n\\t\\ttransform: rotate(-90deg);\\n\\t}\\n\\n}\\n\\n.tc-sidebar-header {\\n\\tcolor: \u003C\u003Ccolour sidebar-foreground>>;\\n\\tfill: \u003C\u003Ccolour sidebar-foreground>>;\\n}\\n\\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\\n\\tfont-weight: normal;\\n}\\n\\n.tc-sidebar-header .tc-sidebar-lists p {\\n\\tmargin-top: 3px;\\n\\tmargin-bottom: 3px;\\n}\\n\\n.tc-sidebar-header .tc-missing-tiddler-label {\\n\\tcolor: \u003C\u003Ccolour sidebar-foreground>>;\\n}\\n\\n.tc-advanced-search input {\\n\\twidth: 60%;\\n}\\n\\n.tc-search a svg {\\n\\twidth: 1.2em;\\n\\theight: 1.2em;\\n\\tvertical-align: middle;\\n}\\n\\n.tc-page-controls {\\n\\tmargin-top: 14px;\\n\\tfont-size: 1.5em;\\n}\\n\\n.tc-page-controls .tc-drop-down {\\n\\tfont-size: 1rem;\\n}\\n\\n.tc-page-controls button {\\n\\tmargin-right: 0.5em;\\n}\\n\\n.tc-page-controls a.tc-tiddlylink:hover {\\n\\ttext-decoration: none;\\n}\\n\\n.tc-page-controls img {\\n\\twidth: 1em;\\n}\\n\\n.tc-page-controls svg {\\n\\tfill: \u003C\u003Ccolour sidebar-controls-foreground>>;\\n}\\n\\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {\\n\\tfill: \u003C\u003Ccolour sidebar-controls-foreground-hover>>;\\n}\\n\\n.tc-sidebar-lists .tc-menu-list-item {\\n\\twhite-space: nowrap;\\n}\\n\\n.tc-menu-list-count {\\n\\tfont-weight: bold;\\n}\\n\\n.tc-menu-list-subitem {\\n\\tpadding-left: 7px;\\n}\\n\\n.tc-story-river {\\n\\tposition: relative;\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\t.tc-sidebar-header {\\n\\t\\tpadding: 14px;\\n\\t\\tmin-height: 32px;\\n\\t\\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\\n\\t\\ttransition: min-height {{$:/config/AnimationDuration}}ms ease-in-out, padding-top {{$:/config/AnimationDuration}}ms ease-in-out, padding-bottom {{$:/config/AnimationDuration}}ms ease-in-out;\\n\\t}\\n\\t\\n\\t\u003C\u003Cif-no-sidebar \\\"\\\"\\\"\\n\\n\\t\\t.tc-sidebar-header {\\n\\t\\t\\tmin-height: 0;\\n\\t\\t\\tpadding-top: 0;\\n\\t\\t\\tpadding-bottom: 0;\\n\\t\\t}\\n\\n\\t\\\"\\\"\\\">>\\n\\n\\t.tc-story-river {\\n\\t\\tposition: relative;\\n\\t\\tpadding: 0;\\n\\t}\\n}\\n\\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\n\\t.tc-message-box {\\n\\t\\tmargin: 21px -21px 21px -21px;\\n\\t}\\n\\n\\t.tc-sidebar-scrollable {\\n\\t\\tposition: fixed;\\n\\t\\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\\n\\t\\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\\n\\t\\tbottom: 0;\\n\\t\\tright: 0;\\n\\t\\toverflow-y: auto;\\n\\t\\toverflow-x: auto;\\n\\t\\t-webkit-overflow-scrolling: touch;\\n\\t\\tmargin: 0 0 0 -42px;\\n\\t\\tpadding: 71px 0 28px 42px;\\n\\t}\\n\\n\\thtml[dir=\\\"rtl\\\"] .tc-sidebar-scrollable {\\n\\t\\tleft: auto;\\n\\t\\tright: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\\n\\t}\\n\\n\\t.tc-story-river {\\n\\t\\tposition: relative;\\n\\t\\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\\n\\t\\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\\n\\t\\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\\n\\t\\tpadding: 42px 42px 42px 42px;\\n\\t}\\n\\n\u003C\u003Cif-no-sidebar \\\"\\n\\n\\t.tc-story-river {\\n\\t\\twidth: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});\\n\\t}\\n\\n\\\">>\\n\\n\\t.tc-story-river.tc-static-story-river {\\n\\t\\tmargin-right: 0;\\n\\t\\tpadding-right: 42px;\\n\\t}\\n\\n}\\n\\n@media print {\\n\\n\\tbody.tc-body {\\n\\t\\tbackground-color: transparent;\\n\\t}\\n\\n\\t.tc-sidebar-header, .tc-topbar {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n\\t.tc-story-river {\\n\\t\\tmargin: 0;\\n\\t\\tpadding: 0;\\n\\t}\\n\\n\\t.tc-story-river .tc-tiddler-frame {\\n\\t\\tmargin: 0;\\n\\t\\tborder: none;\\n\\t\\tpadding: 0;\\n\\t}\\n}\\n\\n/*\\n** Tiddler styles\\n*/\\n\\n.tc-tiddler-frame {\\n\\tposition: relative;\\n\\tmargin-bottom: 28px;\\n\\tbackground-color: \u003C\u003Ccolour tiddler-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour tiddler-border>>;\\n}\\n\\n{{$:/themes/tiddlywiki/vanilla/sticky}}\\n\\n.tc-tiddler-info {\\n\\toverflow: hidden;\\n\\tpadding: 14px 42px 14px 42px;\\n\\tbackground-color: \u003C\u003Ccolour tiddler-info-background>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour tiddler-info-border>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tiddler-info-border>>;\\n}\\n\\n.tc-tiddler-info p {\\n\\tmargin-top: 3px;\\n\\tmargin-bottom: 3px;\\n}\\n\\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\\n\\tbackground-color: \u003C\u003Ccolour tiddler-info-tab-background>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tiddler-info-tab-background>>;\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\t.tc-tiddler-info {\\n\\t\\tpadding: 14px 14px 14px 14px;\\n\\t}\\n\\n}\\n\\n.tc-view-field-table {\\n\\twidth: 100%;\\n}\\n\\n.tc-view-field-name {\\n\\twidth: 1%; /* Makes this column be as narrow as possible */\\n\\twhite-space: nowrap;\\n\\tvertical-align: top;\\n\\ttext-align: right;\\n\\tfont-style: italic;\\n\\tfont-weight: normal;\\n}\\n\\n.tc-view-field-value {\\n\\tword-break: break-all;\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\t.tc-tiddler-frame {\\n\\t\\tpadding: 14px 14px 14px 14px;\\n\\t\\tmargin-bottom: .5em;\\n\\t}\\n\\n\\t.tc-tiddler-info {\\n\\t\\tmargin: 0 -14px 0 -14px;\\n\\t}\\n}\\n\\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\t.tc-tiddler-frame {\\n\\t\\tpadding: 28px 42px 42px 42px;\\n\\t\\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\\n\\t\\tborder-radius: 2px;\\n\\t}\\n\\n\u003C\u003Cif-no-sidebar \\\"\\n\\n\\t.tc-tiddler-frame {\\n\\t\\twidth: 100%;\\n\\t}\\n\\n\\\">>\\n\\n\\t.tc-tiddler-info {\\n\\t\\tmargin: 0 -42px 0 -42px;\\n\\t}\\n}\\n\\n.tc-site-title,\\n.tc-titlebar {\\n\\tfont-weight: normal;\\n\\tfont-size: 2.35em;\\n\\tline-height: 1.35em;\\n\\tcolor: \u003C\u003Ccolour tiddler-title-foreground>>;\\n\\tmargin: 0;\\n}\\n\\n.tc-site-title {\\n\\tcolor: \u003C\u003Ccolour site-title-foreground>>;\\n}\\n\\n.tc-tiddler-title-icon {\\n\\tvertical-align: middle;\\n\\tmargin-right: .1em;\\n}\\n\\n.tc-tiddler-title-icon svg {\\n\\twidth: 0.9em;\\n\\theight: 0.9em;\\n}\\n\\n.tc-system-title-prefix {\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-titlebar h2 {\\n\\tfont-size: 1em;\\n\\tdisplay: inline;\\n}\\n\\n.tc-titlebar img {\\n\\theight: 1em;\\n}\\n\\n.tc-subtitle {\\n\\tfont-size: 0.9em;\\n\\tcolor: \u003C\u003Ccolour tiddler-subtitle-foreground>>;\\n\\tfont-weight: normal;\\n}\\n\\n.tc-subtitle .tc-tiddlylink {\\n\\tmargin-right: .3em;\\n}\\n\\n.tc-tiddler-missing .tc-title {\\n\\tfont-style: italic;\\n\\tfont-weight: normal;\\n}\\n\\n.tc-tiddler-frame .tc-tiddler-controls {\\n\\tfloat: right;\\n\\tpadding: 3px; /* make space for outline */\\n}\\n\\n.tc-tiddler-controls .tc-drop-down {\\n\\tfont-size: 0.6em;\\n}\\n\\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\\n\\tfont-size: 1em;\\n}\\n\\n.tc-tiddler-controls > span > button,\\n.tc-tiddler-controls > span > span > button,\\n.tc-tiddler-controls > span > span > span > button {\\n\\tvertical-align: baseline;\\n\\tmargin-left:5px;\\n}\\n\\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img,\\n.tc-search button svg, .tc-search a svg {\\n\\tfill: \u003C\u003Ccolour tiddler-controls-foreground>>;\\n}\\n\\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\\n\\theight: 0.75em;\\n}\\n\\n.tc-search button svg, .tc-search a svg {\\n\\theight: 1.2em;\\n\\twidth: 1.2em;\\n\\tmargin: 0 0.25em;\\n}\\n\\n.tc-tiddler-controls button.tc-selected svg,\\n.tc-page-controls button.tc-selected svg {\\n\\tfill: \u003C\u003Ccolour tiddler-controls-foreground-selected>>;\\n}\\n\\n.tc-tiddler-controls button.tc-btn-invisible:hover svg,\\n.tc-search button:hover svg, .tc-search a:hover svg {\\n\\tfill: \u003C\u003Ccolour tiddler-controls-foreground-hover>>;\\n}\\n\\n@media print {\\n\\t.tc-tiddler-controls {\\n\\t\\tdisplay: none;\\n\\t}\\n}\\n\\n.tc-tiddler-help { /* Help prompts within tiddler template */\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n\\tmargin-top: 14px;\\n}\\n\\n.tc-tiddler-help a.tc-tiddlylink {\\n\\tcolor: \u003C\u003Ccolour very-muted-foreground>>;\\n}\\n\\n.tc-tiddler-frame .tc-edit-texteditor {\\n\\twidth: 100%;\\n\\tmargin: 4px 0 4px 0;\\n}\\n\\n.tc-tiddler-frame input.tc-edit-texteditor,\\n.tc-tiddler-frame textarea.tc-edit-texteditor,\\n.tc-tiddler-frame iframe.tc-edit-texteditor,\\n.tc-tiddler-frame select.tc-edit-texteditor {\\n\\tpadding: 3px 3px 3px 3px;\\n\\tborder: 1px solid \u003C\u003Ccolour tiddler-editor-border>>;\\n\\tline-height: 1.3em;\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\\n}\\n\\n.tc-tiddler-frame input.tc-edit-texteditor,\\n.tc-tiddler-frame textarea.tc-edit-texteditor,\\n.tc-tiddler-frame iframe.tc-edit-texteditor {\\n\\t-webkit-appearance: none;\\n}\\n\\n.tc-tiddler-frame input.tc-edit-texteditor,\\n.tc-tiddler-frame select.tc-edit-texteditor,\\n.tc-tiddler-frame textarea.tc-edit-texteditor {\\n\\tbackground-color: \u003C\u003Ccolour tiddler-editor-background>>;\\n}\\n\\n.tc-tiddler-frame iframe.tc-edit-texteditor {\\n\\tbackground-color: \u003C\u003Ccolour tiddler-background>>;\\n}\\n\\n.tc-tiddler-frame .tc-edit-fields input.tc-edit-fieldeditor,\\n.tc-tiddler-frame .tc-edit-fields select.tc-edit-fieldeditor,\\n.tc-tiddler-frame .tc-edit-fields textarea.tc-edit-fieldeditor {\\n\\tmargin: 0;\\n\\tpadding: 2px 3px;\\n}\\n\\n.tc-tiddler-frame .tc-binary-warning {\\n\\twidth: 100%;\\n\\theight: 5em;\\n\\ttext-align: center;\\n\\tpadding: 3em 3em 6em 3em;\\n\\tbackground: \u003C\u003Ccolour alert-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour alert-border>>;\\n}\\n\\ncanvas.tc-edit-bitmapeditor {\\n\\tborder: 6px solid \u003C\u003Ccolour tiddler-editor-border-image>>;\\n\\tcursor: crosshair;\\n\\t-moz-user-select: none;\\n\\t-webkit-user-select: none;\\n\\t-ms-user-select: none;\\n\\tmargin-top: 6px;\\n\\tmargin-bottom: 6px;\\n}\\n\\n.tc-edit-bitmapeditor-width {\\n\\tdisplay: block;\\n}\\n\\n.tc-edit-bitmapeditor-height {\\n\\tdisplay: block;\\n}\\n\\n.tc-tiddler-body {\\n\\tclear: both;\\n}\\n\\n.tc-tiddler-frame .tc-tiddler-body {\\n\\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\\n\\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\\n}\\n\\n.tc-titlebar, .tc-tiddler-edit-title {\\n\\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\\n}\\n\\nhtml body.tc-body.tc-single-tiddler-window {\\n\\tmargin: 1em;\\n\\tbackground: \u003C\u003Ccolour tiddler-background>>;\\n}\\n\\n.tc-single-tiddler-window img,\\n.tc-single-tiddler-window svg,\\n.tc-single-tiddler-window canvas,\\n.tc-single-tiddler-window embed,\\n.tc-single-tiddler-window iframe {\\n\\tmax-width: 100%;\\n}\\n\\n/*\\n** Editor\\n*/\\n\\n.tc-editor-toolbar {\\n\\tmargin-top: 8px;\\n}\\n\\n.tc-editor-toolbar button {\\n\\tvertical-align: middle;\\n\\tbackground-color: \u003C\u003Ccolour tiddler-controls-foreground>>;\\n\\tcolor: \u003C\u003Ccolour tiddler-controls-foreground-selected>>;\\n\\tfill: \u003C\u003Ccolour tiddler-controls-foreground-selected>>;\\n\\tborder-radius: 4px;\\n\\tpadding: 3px;\\n\\tmargin: 2px 0 2px 4px;\\n}\\n\\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {\\n\\tmargin-left: 1px;\\n\\twidth: 1em;\\n\\tborder-radius: 8px;\\n}\\n\\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {\\n\\tmargin-left: 11px;\\n}\\n\\n.tc-editor-toolbar button.tc-selected {\\n\\tbackground-color: \u003C\u003Ccolour primary>>;\\n}\\n\\n.tc-editor-toolbar button svg {\\n\\twidth: 1.6em;\\n\\theight: 1.2em;\\n}\\n\\n.tc-editor-toolbar .tc-drop-down button.tc-btn-mini {\\n\\tpadding: 2px 4px;\\n}\\n\\n.tc-editor-toolbar button:hover {\\n\\tbackground-color: \u003C\u003Ccolour tiddler-controls-foreground-selected>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-editor-toolbar .tc-text-editor-toolbar-more {\\n\\twhite-space: normal;\\n}\\n\\n.tc-editor-toolbar .tc-text-editor-toolbar-more button {\\n\\tdisplay: inline-block;\\n\\tpadding: 3px;\\n\\twidth: auto;\\n}\\n\\n.tc-editor-toolbar .tc-search-results {\\n\\tpadding: 0;\\n}\\n\\n.tc-editor-toolbar button.tc-editortoolbar-stamp-button + .tc-popup .tc-drop-down > p {\\n\\tmargin: 0;\\n\\tpadding: 0;\\n}\\n\\n.tc-editor-toolbar button.tc-editortoolbar-stamp-button + .tc-popup .tc-drop-down a.tc-tiddlylink {\\n\\tfont-weight: normal;\\n}\\n\\n/*\\n** Adjustments for fluid-fixed mode\\n*/\\n\\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\n\u003C\u003Cif-fluid-fixed text:\\\"\\\"\\\"\\n\\n\\t.tc-story-river {\\n\\t\\tpadding-right: 0;\\n\\t\\tposition: relative;\\n\\t\\twidth: auto;\\n\\t\\tleft: 0;\\n\\t\\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\\n\\t\\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\\n\\t}\\n\\n\\t.tc-tiddler-frame {\\n\\t\\twidth: 100%;\\n\\t}\\n\\n\\t.tc-sidebar-scrollable {\\n\\t\\tleft: auto;\\n\\t\\tbottom: 0;\\n\\t\\tright: 0;\\n\\t\\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\\n\\t}\\n\\n\\tbody.tc-body .tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\\n\\t\\twidth: 100%;\\n\\t\\twidth: calc(100% - 42px);\\n\\t}\\n\\n\\\"\\\"\\\" hiddenSidebarText:\\\"\\\"\\\"\\n\\n\\t.tc-story-river {\\n\\t\\tpadding-right: 3em;\\n\\t\\tmargin-right: 0;\\n\\t}\\n\\n\\tbody.tc-body .tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\\n\\t\\twidth: 100%;\\n\\t\\twidth: calc(100% - 84px);\\n\\t}\\n\\n\\\"\\\"\\\">>\\n\\n}\\n\\n/*\\n** Toolbar buttons\\n*/\\n\\n.tc-page-controls svg.tc-image-new-button {\\n\\tfill: \u003C\u003Ccolour toolbar-new-button>>;\\n}\\n\\n.tc-page-controls svg.tc-image-options-button {\\n\\tfill: \u003C\u003Ccolour toolbar-options-button>>;\\n}\\n\\n.tc-page-controls svg.tc-image-save-button {\\n\\tfill: \u003C\u003Ccolour toolbar-save-button>>;\\n}\\n\\n.tc-tiddler-controls button svg.tc-image-info-button {\\n\\tfill: \u003C\u003Ccolour toolbar-info-button>>;\\n}\\n\\n.tc-tiddler-controls button svg.tc-image-edit-button {\\n\\tfill: \u003C\u003Ccolour toolbar-edit-button>>;\\n}\\n\\n.tc-tiddler-controls button svg.tc-image-close-button {\\n\\tfill: \u003C\u003Ccolour toolbar-close-button>>;\\n}\\n\\n.tc-tiddler-controls button svg.tc-image-delete-button {\\n\\tfill: \u003C\u003Ccolour toolbar-delete-button>>;\\n}\\n\\n.tc-tiddler-controls button svg.tc-image-cancel-button {\\n\\tfill: \u003C\u003Ccolour toolbar-cancel-button>>;\\n}\\n\\n.tc-tiddler-controls button svg.tc-image-done-button {\\n\\tfill: \u003C\u003Ccolour toolbar-done-button>>;\\n}\\n\\n.tc-page-controls svg.tc-image-layout-button {\\n\\tfill: \u003C\u003Ccolour toolbar-options-button>>;\\n}\\n\\n/*\\n** Tiddler edit mode\\n*/\\n\\n.tc-tiddler-edit-frame em.tc-edit {\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n\\tfont-style: normal;\\n}\\n\\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\\n\\tfont-style: normal;\\n}\\n\\n.tc-type-selector .tc-edit-typeeditor {\\n\\twidth: auto;\\n}\\n\\n.tc-type-selector-dropdown-wrapper {\\n\\tdisplay: inline-block;\\n}\\n\\n\u003C\u003Cset-type-selector-min-width>>\\n\\n.tc-edit-tags {\\n\\tborder: 1px solid \u003C\u003Ccolour tiddler-editor-border>>;\\n\\tpadding: 4px 8px 4px 8px;\\n}\\n\\n.tc-edit-add-tag {\\n\\tdisplay: inline-block;\\n}\\n\\n.tc-edit-add-tag .tc-add-tag-name input {\\n\\twidth: 50%;\\n}\\n\\n.tc-edit-add-tag .tc-keyboard {\\n\\tdisplay:inline;\\n}\\n\\n.tc-edit-tags .tc-tag-label {\\n\\tdisplay: inline-block;\\n}\\n\\n.tc-edit-tags-list {\\n\\tmargin: 14px 0 14px 0;\\n}\\n\\n.tc-remove-tag-button {\\n\\tpadding-left: 4px;\\n}\\n\\n.tc-tiddler-preview {\\n\\toverflow: auto;\\n}\\n\\n.tc-tiddler-preview-preview {\\n\\tfloat: right;\\n\\twidth: 49%;\\n\\tborder: 1px solid \u003C\u003Ccolour tiddler-editor-border>>;\\n\\tmargin: 4px 0 3px 3px;\\n\\tpadding: 3px 3px 3px 3px;\\n}\\n\\n\u003C\u003Cif-editor-height-fixed then:\\\"\\\"\\\"\\n\\n.tc-tiddler-preview-preview {\\n\\toverflow-y: scroll;\\n\\theight: {{$:/config/TextEditor/EditorHeight/Height}};\\n}\\n\\n\\\"\\\"\\\">>\\n\\n.tc-tiddler-frame .tc-tiddler-preview .tc-edit-texteditor {\\n\\twidth: 49%;\\n}\\n\\n.tc-tiddler-frame .tc-tiddler-preview canvas.tc-edit-bitmapeditor {\\n\\tmax-width: 49%;\\n}\\n\\n.tc-edit-fields {\\n\\twidth: 100%;\\n}\\n\\n.tc-edit-fields.tc-edit-fields-small {\\n\\tmargin-top: 0;\\n\\tmargin-bottom: 0;\\n}\\n\\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\\n\\tborder: none;\\n\\tpadding: 4px;\\n}\\n\\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\\n\\tbackground-color: \u003C\u003Ccolour tiddler-editor-fields-odd>>;\\n}\\n\\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\\n\\tbackground-color: \u003C\u003Ccolour tiddler-editor-fields-even>>;\\n}\\n\\n.tc-edit-field-name {\\n\\ttext-align: right;\\n}\\n\\n.tc-edit-field-value input {\\n\\twidth: 100%;\\n}\\n\\n.tc-edit-field-remove {\\n}\\n\\n.tc-edit-field-remove svg {\\n\\theight: 1em;\\n\\twidth: 1em;\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n\\tvertical-align: middle;\\n}\\n\\n.tc-edit-field-add-name-wrapper input.tc-edit-texteditor {\\n\\twidth: auto;\\n}\\n\\n.tc-edit-field-add-name-wrapper {\\n\\tdisplay: inline-block;\\n}\\n\\n.tc-edit-field-add-value {\\n\\tdisplay: inline-block;\\n}\\n\\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\n\\t.tc-edit-field-add-value {\\n\\t\\twidth: 35%;\\n\\t}\\n\\n}\\n\\n.tc-edit-field-add-button {\\n\\tdisplay: inline-block;\\n\\twidth: 10%;\\n}\\n\\n\\n/*\\n** Tiddler editor dropzone\\n*/\\n\\n.tc-dropzone-editor {\\n\\tposition:relative;\\n}\\n\\n.tc-dropzone-editor.tc-dragover .tc-editor-toolbar::after{\\n\\tz-index: 10000;\\n\\ttop:0;\\n\\tleft:0;\\n\\tright:0;\\n\\theight: 100%;\\n\\tbackground: \u003C\u003Ccolour dropzone-background>>;\\n\\tcontent: \\\"\u003C\u003Clingo DropMessage>>\\\";\\n\\tpointer-events: none;\\n\\tposition: absolute;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\tbackground-color: \u003C\u003Ccolor background>>;\\n\\tborder: 4px dashed \u003C\u003Ccolor modal-border>>;\\n\\tfont-weight: bold;\\n\\tfont-size: 150%;\\n\\topacity: 0.8;\\n\\tcolor: \u003C\u003Ccolor foreground>>;\\n}\\n\\n.tc-editor-importpopup {\\n\\twidth: 100%;\\n\\theight: 100%;\\n}\\n\\n.tc-editor-import {\\n\\tposition: absolute;\\n\\ttop: 50%;\\n\\tleft: 50%;\\n\\ttransform: translate(-50%, -50%);\\n\\tbackground: \u003C\u003Ccolor pre-background>>;\\n\\tbox-shadow: 2px 2px 10px \u003C\u003Ccolour foreground>>;\\n\\tpadding: 10px;\\n\\twidth: 96%;\\n\\tborder: 1px solid \u003C\u003Ccolor tiddler-controls-foreground>>;\\n\\ttext-align:center;\\n}\\n\\n.tc-editor-import img {\\n\\tmax-height: 500px;\\n}\\n\\n/*\\n** Storyview Classes\\n*/\\n\\n.tc-viewswitcher .tc-image-button {\\n\\tmargin-right: .3em;\\n}\\n\\n.tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\\n\\tposition: absolute;\\n\\tdisplay: block;\\n\\twidth: 100%;\\n}\\n\\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\n\\t.tc-page-container.tc-page-view-zoomin .tc-tiddler-frame {\\n\\t\\twidth: calc(100% - 84px);\\n\\t}\\n\\n}\\n\\n/*\\n** Dropdowns\\n*/\\n\\n.tc-btn-dropdown {\\n\\ttext-align: left;\\n}\\n\\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\\n\\theight: 1em;\\n\\twidth: 1em;\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-drop-down-wrapper {\\n\\tposition: relative;\\n}\\n\\n.tc-drop-down {\\n\\tmin-width: 380px;\\n\\tborder: 1px solid \u003C\u003Ccolour dropdown-border>>;\\n\\tbackground-color: \u003C\u003Ccolour dropdown-background>>;\\n\\tpadding: 7px 0 7px 0;\\n\\tmargin: 4px 0 0 0;\\n\\twhite-space: nowrap;\\n\\ttext-shadow: none;\\n\\tline-height: 1.4;\\n}\\n\\n.tc-drop-down .tc-drop-down {\\n\\tmargin-left: 14px;\\n}\\n\\n.tc-drop-down button svg, .tc-drop-down a svg {\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-drop-down button:disabled svg {\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-drop-down button.tc-btn-invisible:hover svg {\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-drop-down .tc-drop-down-info {\\n\\tpadding-left: 14px;\\n}\\n\\n.tc-drop-down p {\\n\\tpadding: 0 14px 0 14px;\\n}\\n\\n.tc-drop-down svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n}\\n\\n.tc-drop-down img {\\n\\twidth: 1em;\\n}\\n\\n.tc-drop-down a, .tc-drop-down button {\\n\\tdisplay: block;\\n\\tpadding: 0 14px 0 14px;\\n\\twidth: 100%;\\n\\ttext-align: left;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tline-height: 1.4;\\n}\\n\\n.tc-drop-down .tc-tab-set .tc-tab-buttons button {\\n\\tdisplay: inline-block;\\n\\twidth: auto;\\n\\tmargin-bottom: 0px;\\n\\tborder-bottom-left-radius: 0;\\n\\tborder-bottom-right-radius: 0;\\n}\\n\\n.tc-drop-down .tc-prompt {\\n\\tpadding: 0 14px;\\n}\\n\\n.tc-drop-down .tc-chooser {\\n\\tborder: none;\\n}\\n\\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\\n\\tfont-size: 0.4em;\\n\\tpadding-left: 1.2em;\\n}\\n\\n.tc-drop-down .tc-file-input-wrapper {\\n\\twidth: 100%;\\n}\\n\\n.tc-drop-down .tc-file-input-wrapper button {\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\\n\\tcolor: \u003C\u003Ccolour tiddler-link-background>>;\\n\\tbackground-color: \u003C\u003Ccolour tiddler-link-foreground>>;\\n\\ttext-decoration: none;\\n}\\n\\n.tc-drop-down .tc-tab-buttons button {\\n\\tbackground-color: \u003C\u003Ccolour dropdown-tab-background>>;\\n}\\n\\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\\n\\tbackground-color: \u003C\u003Ccolour dropdown-tab-background-selected>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour dropdown-tab-background-selected>>;\\n}\\n\\n.tc-drop-down-bullet {\\n\\tdisplay: inline-block;\\n\\twidth: 0.5em;\\n}\\n\\n.tc-drop-down .tc-tab-contents a {\\n\\tpadding: 0 0.5em 0 0.5em;\\n}\\n\\n.tc-block-dropdown-wrapper {\\n\\tposition: relative;\\n}\\n\\n.tc-block-dropdown {\\n\\tposition: absolute;\\n\\tmin-width: 220px;\\n\\tborder: 1px solid \u003C\u003Ccolour dropdown-border>>;\\n\\tbackground-color: \u003C\u003Ccolour dropdown-background>>;\\n\\tpadding: 7px 0;\\n\\tmargin: 4px 0 0 0;\\n\\twhite-space: nowrap;\\n\\tz-index: 1000;\\n\\ttext-shadow: none;\\n}\\n\\n.tc-block-dropdown.tc-search-drop-down {\\n\\tmargin-left: -12px;\\n}\\n\\n.tc-block-dropdown a {\\n\\tdisplay: block;\\n\\tpadding: 4px 14px 4px 14px;\\n}\\n\\n.tc-block-dropdown.tc-search-drop-down a {\\n\\tdisplay: block;\\n\\tpadding: 0px 10px 0px 10px;\\n}\\n\\n.tc-drop-down .tc-dropdown-item-plain,\\n.tc-block-dropdown .tc-dropdown-item-plain {\\n\\tpadding: 4px 14px 4px 7px;\\n}\\n\\n.tc-drop-down .tc-dropdown-item,\\n.tc-block-dropdown .tc-dropdown-item {\\n\\tpadding: 4px 14px 4px 7px;\\n\\tcolor: \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-block-dropdown a.tc-tiddlylink:hover {\\n\\tcolor: \u003C\u003Ccolour tiddler-link-background>>;\\n\\tbackground-color: \u003C\u003Ccolour tiddler-link-foreground>>;\\n\\ttext-decoration: none;\\n}\\n\\n.tc-search-results {\\n\\tpadding: 0 7px 0 7px;\\n}\\n\\n.tc-image-chooser, .tc-colour-chooser {\\n\\twhite-space: normal;\\n}\\n\\n.tc-image-chooser a,\\n.tc-colour-chooser a {\\n\\tdisplay: inline-block;\\n\\tvertical-align: top;\\n\\ttext-align: center;\\n\\tposition: relative;\\n}\\n\\n.tc-image-chooser a {\\n\\tborder: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tpadding: 2px;\\n\\tmargin: 2px;\\n\\twidth: 4em;\\n\\theight: 4em;\\n}\\n\\n.tc-colour-chooser a {\\n\\tpadding: 3px;\\n\\twidth: 2em;\\n\\theight: 2em;\\n\\tvertical-align: middle;\\n}\\n\\n.tc-image-chooser a:hover,\\n.tc-colour-chooser a:hover {\\n\\tbackground: \u003C\u003Ccolour primary>>;\\n\\tpadding: 0px;\\n\\tborder: 3px solid \u003C\u003Ccolour primary>>;\\n}\\n\\n.tc-image-chooser a svg,\\n.tc-image-chooser a img {\\n\\tdisplay: inline-block;\\n\\twidth: auto;\\n\\theight: auto;\\n\\tmax-width: 3.5em;\\n\\tmax-height: 3.5em;\\n\\tposition: absolute;\\n\\ttop: 0;\\n\\tbottom: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tmargin: auto;\\n}\\n\\n/* Make search dropdown visible on small screens. issue #7003 */\\n@media (max-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\n\\t.tc-sidebar-search .tc-block-dropdown-wrapper {\\n\\t\\tposition: initial;\\n\\t}\\n\\n}\\n\\n/*\\n** Modals\\n*/\\n\\n.tc-modal-wrapper {\\n\\tposition: fixed;\\n\\toverflow: auto;\\n\\toverflow-y: scroll;\\n\\ttop: 0;\\n\\tright: 0;\\n\\tbottom: 0;\\n\\tleft: 0;\\n\\tz-index: 900;\\n}\\n\\n.tc-modal-backdrop {\\n\\tposition: fixed;\\n\\ttop: 0;\\n\\tright: 0;\\n\\tbottom: 0;\\n\\tleft: 0;\\n\\tz-index: 1000;\\n\\tbackground-color: \u003C\u003Ccolour modal-backdrop>>;\\n}\\n\\n.tc-modal {\\n\\tz-index: 1100;\\n\\tbackground-color: \u003C\u003Ccolour modal-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour modal-border>>;\\n}\\n\\n@media (max-width: 55em) {\\n\\t.tc-modal {\\n\\t\\tposition: fixed;\\n\\t\\ttop: 1em;\\n\\t\\tleft: 1em;\\n\\t\\tright: 1em;\\n\\t}\\n\\n\\t.tc-modal-body {\\n\\t\\toverflow-y: auto;\\n\\t\\tmax-height: 400px;\\n\\t\\tmax-height: 60vh;\\n\\t}\\n}\\n\\n@media (min-width: 55em) {\\n\\t.tc-modal {\\n\\t\\tposition: fixed;\\n\\t\\ttop: 2em;\\n\\t\\tleft: 25%;\\n\\t\\twidth: 50%;\\n\\t}\\n\\n\\t.tc-modal-body {\\n\\t\\toverflow-y: auto;\\n\\t\\tmax-height: 400px;\\n\\t\\tmax-height: 60vh;\\n\\t}\\n}\\n\\n.tc-modal-header {\\n\\tpadding: 9px 15px;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour modal-header-border>>;\\n}\\n\\n.tc-modal-header h3 {\\n\\tmargin: 0;\\n\\tline-height: 30px;\\n}\\n\\n.tc-modal-header img, .tc-modal-header svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n}\\n\\n.tc-modal-body {\\n\\tpadding: 15px;\\n}\\n\\n.tc-modal-footer {\\n\\tpadding: 14px 15px 15px;\\n\\tmargin-bottom: 0;\\n\\ttext-align: right;\\n\\tbackground-color: \u003C\u003Ccolour modal-footer-background>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour modal-footer-border>>;\\n}\\n\\n.tc-modal-prevent-scroll {\\n\\toverflow: hidden;\\n}\\n\\n/*\\n** Centered modals\\n*/\\n.tc-modal-centered .tc-modal {\\n\\twidth: auto;\\n\\ttop: 50%;\\n\\tleft: 50%;\\n\\ttransform: translate(-50%, -50%) !important;\\n}\\n\\n/*\\n** Notifications\\n*/\\n\\n.tc-notification {\\n\\tposition: fixed;\\n\\ttop: 14px;\\n\\tright: 42px;\\n\\tz-index: 1300;\\n\\tmax-width: 280px;\\n\\tpadding: 0 14px 0 14px;\\n\\tbackground-color: \u003C\u003Ccolour notification-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour notification-border>>;\\n}\\n\\n/*\\n** Tabs\\n*/\\n\\n.tc-tab-set.tc-vertical {\\n\\tdisplay: -webkit-flex;\\n\\tdisplay: flex;\\n}\\n\\n.tc-tab-buttons {\\n\\tfont-size: 0.85em;\\n\\tpadding-top: 1em;\\n\\tmargin-bottom: -2px;\\n}\\n\\n.tc-tab-buttons.tc-vertical {\\n\\tz-index: 100;\\n\\tdisplay: block;\\n\\tpadding-top: 14px;\\n\\tvertical-align: top;\\n\\ttext-align: right;\\n\\tmargin-bottom: inherit;\\n\\tmargin-right: -1px;\\n\\tmax-width: 33%;\\n\\t-webkit-flex: 0 0 auto;\\n\\tflex: 0 0 auto;\\n}\\n\\n.tc-tab-buttons button.tc-tab-selected {\\n\\tcolor: \u003C\u003Ccolour tab-foreground-selected>>;\\n\\tbackground-color: \u003C\u003Ccolour tab-background-selected>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-border-selected>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-border-selected>>;\\n\\tborder-right: 1px solid \u003C\u003Ccolour tab-border-selected>>;\\n}\\n\\n.tc-tab-buttons button {\\n\\tcolor: \u003C\u003Ccolour tab-foreground>>;\\n\\tpadding: 3px 5px 3px 5px;\\n\\tmargin-right: 0.3em;\\n\\tfont-weight: normal;\\n\\tborder: none;\\n\\tbackground: inherit;\\n\\tbackground-color: \u003C\u003Ccolour tab-background>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-right: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-top-left-radius: 2px;\\n\\tborder-top-right-radius: 2px;\\n\\tborder-bottom-left-radius: 0;\\n\\tborder-bottom-right-radius: 0;\\n}\\n\\n.tc-tab-buttons.tc-vertical button {\\n\\tdisplay: block;\\n\\twidth: 100%;\\n\\tmargin-top: 3px;\\n\\tmargin-right: 0;\\n\\ttext-align: right;\\n\\tbackground-color: \u003C\u003Ccolour tab-background>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-right: none;\\n\\tborder-top-left-radius: 2px;\\n\\tborder-bottom-left-radius: 2px;\\n\\tborder-top-right-radius: 0;\\n\\tborder-bottom-right-radius: 0;\\n}\\n\\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\\n\\tbackground-color: \u003C\u003Ccolour tab-background-selected>>;\\n\\tborder-right: 1px solid \u003C\u003Ccolour tab-background-selected>>;\\n}\\n\\n.tc-tab-divider {\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-divider>>;\\n}\\n\\n.tc-tab-divider.tc-vertical {\\n\\tdisplay: none;\\n}\\n\\n.tc-tab-content {\\n\\tmargin-top: 14px;\\n}\\n\\n.tc-tab-content.tc-vertical {\\n\\tdisplay: inline-block;\\n\\tvertical-align: top;\\n\\tpadding-top: 0;\\n\\tpadding-left: 14px;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\t-webkit-flex: 1 0 70%;\\n\\tflex: 1 0 70%;\\n\\toverflow: auto;\\n}\\n\\n.tc-sidebar-lists .tc-tab-buttons {\\n\\tmargin-bottom: -1px;\\n}\\n\\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\\n\\tbackground-color: \u003C\u003Ccolour sidebar-tab-background-selected>>;\\n\\tcolor: \u003C\u003Ccolour sidebar-tab-foreground-selected>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour sidebar-tab-border-selected>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour sidebar-tab-border-selected>>;\\n\\tborder-right: 1px solid \u003C\u003Ccolour sidebar-tab-border-selected>>;\\n}\\n\\n.tc-sidebar-lists .tc-tab-buttons button {\\n\\tbackground-color: \u003C\u003Ccolour sidebar-tab-background>>;\\n\\tcolor: \u003C\u003Ccolour sidebar-tab-foreground>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour sidebar-tab-border>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour sidebar-tab-border>>;\\n\\tborder-right: 1px solid \u003C\u003Ccolour sidebar-tab-border>>;\\n}\\n\\n.tc-sidebar-lists .tc-tab-divider {\\n\\tborder-top: 1px solid \u003C\u003Ccolour sidebar-tab-divider>>;\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\\n\\tdisplay: block;\\n\\twidth: 100%;\\n\\tbackground-color: \u003C\u003Ccolour sidebar-tab-background>>;\\n\\tborder-top: none;\\n\\tborder-left: none;\\n\\tborder-bottom: none;\\n\\tborder-right: 1px solid #ccc;\\n\\tmargin-bottom: inherit;\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\\n\\tbackground-color: \u003C\u003Ccolour sidebar-tab-background-selected>>;\\n\\tborder: none;\\n}\\n\\n/*\\n** Manager\\n*/\\n\\n.tc-manager-wrapper {\\n\\t\\n}\\n\\n.tc-manager-controls {\\n\\t\\n}\\n\\n.tc-manager-control {\\n\\tmargin: 0.5em 0;\\n}\\n\\n.tc-manager-control select {\\n\\tmax-width: 100%;\\n}\\n\\n.tc-manager-list {\\n\\twidth: 100%;\\n\\tborder-top: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-right: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-manager-list-item {\\n\\n}\\n\\n.tc-manager-list-item-heading {\\n\\tdisplay: block;\\n\\twidth: 100%;\\n\\ttext-align: left;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tpadding: 3px;\\n}\\n\\n.tc-manager-list-item-heading-selected {\\n\\tfont-weight: bold;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tbackground-color: \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-manager-list-item-heading:hover {\\n\\tbackground: \u003C\u003Ccolour primary>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-manager-list-item-content {\\n\\tdisplay: flex;\\n}\\n\\n.tc-manager-list-item-content-sidebar {\\n\\tflex: 1 0;\\n\\tbackground: \u003C\u003Ccolour tiddler-editor-background>>;\\n\\tborder-right: 0.5em solid \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-bottom: 0.5em solid \u003C\u003Ccolour muted-foreground>>;\\n\\twhite-space: nowrap;\\n}\\n\\n.tc-manager-list-item-content-item-heading {\\n\\tdisplay: block;\\n\\twidth: 100%;\\n\\ttext-align: left;\\n\\tbackground: \u003C\u003Ccolour muted-foreground>>;\\n\\ttext-transform: uppercase;\\n\\tfont-size: 0.6em;\\n\\tfont-weight: bold;\\n\\tpadding: 0.5em 0 0.5em 0;\\n}\\n\\n.tc-manager-list-item-content-item-body {\\n\\tpadding: 0 0.5em 0 0.5em;\\n}\\n\\n.tc-manager-list-item-content-item-body > pre {\\n\\tmargin: 0.5em 0 0.5em 0;\\n\\tborder: none;\\n\\tbackground: inherit;\\n}\\n\\n.tc-manager-list-item-content-tiddler {\\n\\tflex: 3 1;\\n\\tborder-left: 0.5em solid \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-right: 0.5em solid \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-bottom: 0.5em solid \u003C\u003Ccolour muted-foreground>>;\\n}\\n\\n.tc-manager-list-item-content-item-body > table {\\n\\tborder: none;\\n\\tpadding: 0;\\n\\tmargin: 0;\\n}\\n\\n.tc-manager-list-item-content-item-body > table td {\\n\\tborder: none;\\n}\\n\\n.tc-manager-icon-editor > button {\\n\\twidth: 100%;\\n}\\n\\n.tc-manager-icon-editor > button > svg,\\n.tc-manager-icon-editor > button > button {\\n\\twidth: 100%;\\n\\theight: auto;\\n}\\n\\n/*\\n** Import table\\n*/\\n\\n.tc-import-table {\\n\\twidth: 100%;\\n}\\n\\n.tc-import-table svg.tc-image-edit-button {\\n\\tmax-width: unset;\\n}\\n\\n.tc-import-table th:first-of-type {\\n\\twidth: 10%;\\n}\\n\\n.tc-import-table th:last-of-type {\\n\\twidth: 30%;\\n}\\n\\n.tc-import-table .tc-row-disabled {\\n\\tbackground: \u003C\u003Ccolour very-muted-foreground>>10;\\n\\topacity: 0.8;\\n}\\n\\n.tc-import-table .tc-row-warning {\\n\\tbackground: \u003C\u003Ccolour diff-delete-background>>50;\\n}\\n\\n/*\\n** Alerts\\n*/\\n\\n.tc-alerts {\\n\\tposition: fixed;\\n\\ttop: 28px;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tmax-width: 50%;\\n\\tz-index: 20000;\\n}\\n\\n.tc-alert {\\n\\tposition: relative;\\n\\tmargin: 14px;\\n\\tpadding: 7px;\\n\\tborder: 1px solid \u003C\u003Ccolour alert-border>>;\\n\\tbackground-color: \u003C\u003Ccolour alert-background>>;\\n}\\n\\n.tc-alert-toolbar {\\n\\tposition: absolute;\\n\\ttop: 7px;\\n\\tright: 7px;\\n\\tline-height: 0;\\n}\\n\\n.tc-alert-toolbar svg {\\n\\tfill: \u003C\u003Ccolour alert-muted-foreground>>;\\n}\\n\\n.tc-alert-subtitle {\\n\\tcolor: \u003C\u003Ccolour alert-muted-foreground>>;\\n\\tfont-weight: bold;\\n\\tfont-size: 0.8em;\\n\\tmargin-bottom: 0.5em;\\n}\\n\\n.tc-alert-body > p {\\n\\tmargin: 0;\\n}\\n\\n.tc-alert-highlight {\\n\\tcolor: \u003C\u003Ccolour alert-highlight>>;\\n}\\n\\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\\n\\n\\t.tc-static-alert {\\n\\t\\tposition: relative;\\n\\t}\\n\\n\\t.tc-static-alert-inner {\\n\\t\\tposition: absolute;\\n\\t\\tz-index: 100;\\n\\t}\\n\\n}\\n\\n.tc-static-alert-inner {\\n\\tpadding: 0 2px 2px 42px;\\n\\tcolor: \u003C\u003Ccolour static-alert-foreground>>;\\n}\\n\\n/*\\n** Floating drafts list\\n*/\\n\\n.tc-drafts-list {\\n\\tz-index: 2000;\\n\\tposition: fixed;\\n\\tfont-size: 0.8em;\\n\\tleft: 0;\\n\\tbottom: 0;\\n}\\n\\n.tc-drafts-list a {\\n\\tmargin: 0 0.5em;\\n\\tpadding: 4px 4px;\\n\\tborder-top-left-radius: 4px;\\n\\tborder-top-right-radius: 4px;\\n\\tborder: 1px solid \u003C\u003Ccolour background>>;\\n\\tborder-bottom: none;\\n\\tbackground: \u003C\u003Ccolour dirty-indicator>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-drafts-list a:hover {\\n\\ttext-decoration: none;\\n\\tbackground: \u003C\u003Ccolour foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-drafts-list a svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n\\tvertical-align: text-bottom;\\n}\\n\\n/*\\n** Control panel\\n*/\\n\\n.tc-control-panel td {\\n\\tpadding: 4px;\\n}\\n\\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\\n\\twidth: 100%;\\n}\\n\\n.tc-plugin-info {\\n\\tdisplay: flex;\\n\\ttext-shadow: none;\\n\\tborder: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tfill: \u003C\u003Ccolour muted-foreground>>;\\n\\tbackground-color: \u003C\u003Ccolour background>>;\\n\\tmargin: 0.5em 0 0.5em 0;\\n\\tpadding: 4px;\\n\\talign-items: center;\\n}\\n\\n.tc-sidebar-lists a.tc-tiddlylink.tc-plugin-info {\\n\\tcolor: \u003C\u003Ccolour tiddler-link-foreground>>;\\n}\\n\\n\\n.tc-plugin-info-sub-plugins .tc-plugin-info {\\n\\tmargin: 0.5em;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-plugin-info-sub-plugin-indicator {\\n\\tmargin: -16px 1em 0 2em;\\n}\\n\\n.tc-plugin-info-sub-plugin-indicator button {\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tbackground: \u003C\u003Ccolour foreground>>;\\n\\tborder-radius: 8px;\\n\\tpadding: 2px 7px;\\n\\tfont-size: 0.75em;\\n}\\n\\n.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown {\\n\\tmargin-left: 1em;\\n\\tmargin-right: 1em;\\n}\\n\\n.tc-plugin-info-disabled {\\n\\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\\n\\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\\n}\\n\\n.tc-plugin-info-disabled:hover {\\n\\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\\n\\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\\n}\\n\\na.tc-tiddlylink.tc-plugin-info:hover {\\n\\ttext-decoration: none;\\n\\tbackground-color: \u003C\u003Ccolour primary>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n}\\n\\na.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk > svg {\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-plugin-info-chunk {\\n\\tmargin: 2px;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-toggle {\\n\\tflex-grow: 0;\\n\\tflex-shrink: 0;\\n\\tline-height: 1;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-icon {\\n\\tflex-grow: 0;\\n\\tflex-shrink: 0;\\n\\tline-height: 1;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-description {\\n\\tflex-grow: 1;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-buttons {\\n\\tfont-size: 0.8em;\\n\\tline-height: 1.2;\\n\\tflex-grow: 0;\\n\\tflex-shrink: 0;\\n\\ttext-align: right;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-description h1 {\\n\\tfont-size: 1em;\\n\\tline-height: 1.2;\\n\\tmargin: 2px 0 2px 0;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-description h2 {\\n\\tfont-size: 0.8em;\\n\\tline-height: 1.2;\\n\\tmargin: 2px 0 2px 0;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-description div {\\n\\tfont-size: 0.7em;\\n\\tline-height: 1.2;\\n\\tmargin: 2px 0 2px 0;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n}\\n\\n.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg {\\n\\twidth: 2em;\\n\\theight: 2em;\\n}\\n\\n.tc-plugin-info-dropdown {\\n\\tborder: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tmargin-top: -8px;\\n}\\n\\n.tc-plugin-info-dropdown-message {\\n\\tbackground: \u003C\u003Ccolour message-background>>;\\n\\tpadding: 0.5em 1em 0.5em 1em;\\n\\tfont-weight: bold;\\n\\tfont-size: 0.8em;\\n}\\n\\n.tc-plugin-info-dropdown-body {\\n\\tpadding: 1em 1em 0 1em;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-plugin-info-sub-plugins {\\n\\tpadding: 0.5em;\\n\\tmargin: 0 1em 1em 1em;\\n\\tbackground: \u003C\u003Ccolour notification-background>>;\\n}\\n\\n.tc-install-plugin {\\n\\tfont-weight: bold;\\n\\tbackground: green;\\n\\tcolor: white;\\n\\tfill: white;\\n\\tborder-radius: 4px;\\n\\tpadding: 3px;\\n}\\n\\n.tc-install-plugin.tc-reinstall-downgrade {\\n\\tbackground: red;\\n}\\n\\n.tc-install-plugin.tc-reinstall {\\n\\tbackground: blue;\\n}\\n\\n.tc-install-plugin.tc-reinstall-upgrade {\\n\\tbackground: orange;\\n}\\n\\n.tc-check-list {\\n\\tline-height: 2em;\\n}\\n\\n.tc-check-list .tc-image-button {\\n\\theight: 1.5em;\\n}\\n\\n/*\\n** Message boxes\\n*/\\n\\n.tc-message-box {\\n\\tborder: 1px solid \u003C\u003Ccolour message-border>>;\\n\\tbackground: \u003C\u003Ccolour message-background>>;\\n\\tpadding: 0px 21px 0px 21px;\\n\\tfont-size: 12px;\\n\\tline-height: 18px;\\n\\tcolor: \u003C\u003Ccolour message-foreground>>;\\n}\\n\\n.tc-message-box svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n\\tvertical-align: text-bottom;\\n}\\n\\n/*\\n** Pictures\\n*/\\n\\n.tc-bordered-image {\\n\\tborder: 1px solid \u003C\u003Ccolour muted-foreground>>;\\n\\tpadding: 5px;\\n\\tmargin: 5px;\\n}\\n\\n/*\\n** Floats\\n*/\\n\\n.tc-float-right {\\n\\tfloat: right;\\n}\\n\\n/*\\n** Chooser\\n*/\\n\\n.tc-chooser {\\n\\tborder-right: 1px solid \u003C\u003Ccolour table-header-background>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour table-header-background>>;\\n}\\n\\n\\n.tc-chooser-item {\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour table-header-background>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour table-header-background>>;\\n\\tpadding: 2px 4px 2px 14px;\\n}\\n\\n.tc-drop-down .tc-chooser-item {\\n\\tpadding: 2px;\\n}\\n\\n.tc-chosen,\\n.tc-chooser-item:hover {\\n\\tbackground-color: \u003C\u003Ccolour table-header-background>>;\\n\\tborder-color: \u003C\u003Ccolour table-footer-background>>;\\n}\\n\\n.tc-chosen .tc-tiddlylink {\\n\\tcursor:default;\\n}\\n\\n.tc-chooser-item .tc-tiddlylink {\\n\\tdisplay: block;\\n\\ttext-decoration: none;\\n\\tbackground-color: transparent;\\n}\\n\\n.tc-chooser-item:hover .tc-tiddlylink:hover {\\n\\ttext-decoration: none;\\n}\\n\\n.tc-drop-down .tc-chosen .tc-tiddlylink,\\n.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-chosen > .tc-tiddlylink:before {\\n\\tmargin-left: -10px;\\n\\tposition: relative;\\n\\tcontent: \\\"» \\\";\\n}\\n\\n.tc-chooser-item svg,\\n.tc-chooser-item img{\\n\\twidth: 1em;\\n\\theight: 1em;\\n\\tvertical-align: middle;\\n}\\n\\n.tc-language-chooser .tc-image-button img {\\n\\twidth: 2em;\\n\\tvertical-align: -0.15em;\\n}\\n\\n/*\\n** Palette swatches\\n*/\\n\\n.tc-swatches-horiz {\\n}\\n\\n.tc-swatches-horiz .tc-swatch {\\n\\tdisplay: inline-block;\\n}\\n\\n.tc-swatch {\\n\\twidth: 2em;\\n\\theight: 2em;\\n\\tmargin: 0.4em;\\n\\tborder: 1px solid #888;\\n}\\n\\ninput.tc-palette-manager-colour-input {\\n\\twidth: 100%;\\n\\tpadding: 0;\\n}\\n\\n/*\\n** Table of contents\\n*/\\n\\n.tc-sidebar-lists .tc-table-of-contents {\\n\\twhite-space: nowrap;\\n}\\n\\n.tc-table-of-contents button,\\n.tc-table-of-contents .toc-item-muted {\\n\\tcolor: \u003C\u003Ccolour sidebar-foreground>>;\\n}\\n\\n.tc-table-of-contents svg {\\n\\twidth: 0.7em;\\n\\theight: 0.7em;\\n\\tvertical-align: middle;\\n\\tfill: \u003C\u003Ccolour sidebar-foreground>>;\\n}\\n\\n.tc-table-of-contents ol {\\n\\tlist-style-type: none;\\n\\tpadding-left: 0;\\n}\\n\\n.tc-table-of-contents ol ol {\\n\\tpadding-left: 1em;\\n}\\n\\n.tc-table-of-contents li {\\n\\tfont-size: 1.0em;\\n\\tfont-weight: bold;\\n}\\n\\n.tc-table-of-contents li a {\\n\\tfont-weight: bold;\\n}\\n\\n.tc-table-of-contents li li {\\n\\tfont-size: 0.95em;\\n\\tfont-weight: normal;\\n\\tline-height: 1.4;\\n}\\n\\n.tc-table-of-contents li li a {\\n\\tfont-weight: normal;\\n}\\n\\n.tc-table-of-contents li li li {\\n\\tfont-size: 0.95em;\\n\\tfont-weight: normal;\\n\\tline-height: 1.5;\\n}\\n\\n.tc-table-of-contents li li li li {\\n\\tfont-size: 0.95em;\\n\\tfont-weight: normal;\\n}\\n\\n.tc-tabbed-table-of-contents {\\n\\tdisplay: -webkit-flex;\\n\\tdisplay: flex;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-table-of-contents {\\n\\tz-index: 100;\\n\\tdisplay: inline-block;\\n\\tpadding-left: 1em;\\n\\tmax-width: 50%;\\n\\t-webkit-flex: 0 0 auto;\\n\\tflex: 0 0 auto;\\n\\tbackground: \u003C\u003Ccolour tab-background>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tab-border>>;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\\n\\tdisplay: block;\\n\\tpadding: 0.12em 1em 0.12em 0.25em;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-background>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-background>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tab-background>>;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\\n\\ttext-decoration: none;\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tbackground: \u003C\u003Ccolour tab-border>>;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\\n\\tborder-top: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-left: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tmargin-right: -1px;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\\n\\ttext-decoration: none;\\n}\\n\\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\\n\\tdisplay: inline-block;\\n\\tvertical-align: top;\\n\\tpadding-left: 1.5em;\\n\\tpadding-right: 1.5em;\\n\\tborder: 1px solid \u003C\u003Ccolour tab-border>>;\\n\\t-webkit-flex: 1 0 50%;\\n\\tflex: 1 0 50%;\\n}\\n\\n/*\\n** Dirty indicator\\n*/\\n\\nhtml body svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-clean {\\n\\tvisibility: visible;\\n}\\n\\nhtml body svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-dirty {\\n\\tvisibility: hidden;\\n}\\n\\nhtml body.tc-dirty svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-clean {\\n\\tvisibility: hidden;\\n}\\n\\nhtml body.tc-dirty svg.tc-image-save-button-dynamic .tc-image-save-button-dynamic-dirty {\\n\\tvisibility: visible;\\n}\\n\\nhtml body.tc-dirty span.tc-dirty-indicator, html body.tc-dirty span.tc-dirty-indicator svg {\\n\\tfill: \u003C\u003Ccolour dirty-indicator>>;\\n\\tcolor: \u003C\u003Ccolour dirty-indicator>>;\\n}\\n\\n/*\\n** File inputs\\n*/\\n\\n.tc-file-input-wrapper {\\n\\tposition: relative;\\n\\toverflow: hidden;\\n\\tdisplay: inline-block;\\n\\tvertical-align: middle;\\n}\\n\\n.tc-file-input-wrapper input[type=file] {\\n\\tposition: absolute;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tbottom: 0;\\n\\tfont-size: 999px;\\n\\tmax-width: 100%;\\n\\tmax-height: 100%;\\n\\tfilter: alpha(opacity=0);\\n\\topacity: 0;\\n\\toutline: none;\\n\\tbackground: white;\\n\\tcursor: pointer;\\n\\tdisplay: inline-block;\\n}\\n\\n::-webkit-file-upload-button {\\n\\tcursor:pointer;\\n}\\n\\n/*\\n** Thumbnail macros\\n*/\\n\\n.tc-thumbnail-wrapper {\\n\\tposition: relative;\\n\\tdisplay: inline-block;\\n\\tmargin: 6px;\\n\\tvertical-align: top;\\n}\\n\\n.tc-thumbnail-right-wrapper {\\n\\tfloat:right;\\n\\tmargin: 0.5em 0 0.5em 0.5em;\\n}\\n\\n.tc-thumbnail-image {\\n\\ttext-align: center;\\n\\toverflow: hidden;\\n\\tborder-radius: 3px;\\n}\\n\\n.tc-thumbnail-image svg,\\n.tc-thumbnail-image img {\\n\\tfilter: alpha(opacity=1);\\n\\topacity: 1;\\n\\tmin-width: 100%;\\n\\tmin-height: 100%;\\n\\tmax-width: 100%;\\n}\\n\\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\\n\\tfilter: alpha(opacity=0.8);\\n\\topacity: 0.8;\\n}\\n\\n.tc-thumbnail-background {\\n\\tposition: absolute;\\n\\tborder-radius: 3px;\\n}\\n\\n.tc-thumbnail-icon svg,\\n.tc-thumbnail-icon img {\\n\\twidth: 3em;\\n\\theight: 3em;\\n\\t\u003C\u003Cfilter \\\"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\\\">>\\n}\\n\\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\\n\\tfill: #fff;\\n\\t\u003C\u003Cfilter \\\"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\\\">>\\n}\\n\\n.tc-thumbnail-icon {\\n\\tposition: absolute;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tbottom: 0;\\n\\tdisplay: -webkit-flex;\\n\\t-webkit-align-items: center;\\n\\t-webkit-justify-content: center;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n}\\n\\n.tc-thumbnail-caption {\\n\\tposition: absolute;\\n\\tbackground-color: #777;\\n\\tcolor: #fff;\\n\\ttext-align: center;\\n\\tbottom: 0;\\n\\twidth: 100%;\\n\\tfilter: alpha(opacity=0.9);\\n\\topacity: 0.9;\\n\\tline-height: 1.4;\\n\\tborder-bottom-left-radius: 3px;\\n\\tborder-bottom-right-radius: 3px;\\n}\\n\\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\\n\\tfilter: alpha(opacity=1);\\n\\topacity: 1;\\n}\\n\\n/*\\n** Diffs\\n*/\\n\\n.tc-diff-equal {\\n\\tbackground-color: \u003C\u003Ccolour diff-equal-background>>;\\n\\tcolor: \u003C\u003Ccolour diff-equal-foreground>>;\\n}\\n\\n.tc-diff-insert {\\n\\tbackground-color: \u003C\u003Ccolour diff-insert-background>>;\\n\\tcolor: \u003C\u003Ccolour diff-insert-foreground>>;\\n}\\n\\n.tc-diff-delete {\\n\\tbackground-color: \u003C\u003Ccolour diff-delete-background>>;\\n\\tcolor: \u003C\u003Ccolour diff-delete-foreground>>;\\n}\\n\\n.tc-diff-invisible {\\n\\tbackground-color: \u003C\u003Ccolour diff-invisible-background>>;\\n\\tcolor: \u003C\u003Ccolour diff-invisible-foreground>>;\\n}\\n\\n.tc-diff-tiddlers th {\\n\\ttext-align: right;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tfont-weight: normal;\\n\\tfont-style: italic;\\n}\\n\\n.tc-diff-tiddlers pre {\\n\\tmargin: 0;\\n\\tpadding: 0;\\n\\tborder: none;\\n\\tbackground: none;\\n}\\n\\n/*\\n** Errors\\n*/\\n\\n.tc-error {\\n\\tbackground: #f00;\\n\\tcolor: #fff;\\n}\\n\\n/*\\n** Tree macro\\n*/\\n\\n.tc-tree div {\\n\\tpadding-left: 14px;\\n}\\n\\n.tc-tree ol {\\n\\tlist-style-type: none;\\n\\tpadding-left: 0;\\n\\tmargin-top: 0;\\n}\\n\\n.tc-tree ol ol {\\n\\tpadding-left: 1em;\\n}\\n\\n.tc-tree button {\\n\\tcolor: #acacac;\\n}\\n\\n.tc-tree svg {\\n\\tfill: #acacac;\\n}\\n\\n.tc-tree span svg {\\n\\twidth: 1em;\\n\\theight: 1em;\\n\\tvertical-align: baseline;\\n}\\n\\n.tc-tree li span {\\n\\tcolor: lightgray;\\n}\\n\\nselect {\\n\\tcolor: \u003C\u003Ccolour select-tag-foreground>>;\\n\\tbackground: \u003C\u003Ccolour select-tag-background>>;\\n}\\n\\n/*\\n** Translink macro\\n*/\\n\\n.tc-translink {\\n\\tbackground-color: \u003C\u003Ccolour pre-background>>;\\n\\tborder: 1px solid \u003C\u003Ccolour pre-border>>;\\n\\tpadding: 0 3px;\\n\\tborder-radius: 3px;\\n}\\n\\ndiv.tc-translink > div {\\n\\tmargin: 1em;\\n}\\n\\ndiv.tc-translink > div > a:first-child > h1 {\\n\\tfont-size: 1.2em;\\n\\tfont-weight: bold;\\n}\\n\\nspan.tc-translink > a:first-child {\\n\\tfont-weight: bold;\\n}\\n\\n/*\\n** Classes for displaying globals\\n*/\\n\\n.tc-global-tiddler-body {\\n\\tpadding: 0.25em;\\n\\tborder: 1px solid \u003C\u003Ccolour foreground>>;\\n\\tbackground-color: \u003C\u003Ccolour muted-foreground>>;\\n\\tborder-radius: 3px;\\n}\\n\\n.tc-global-tiddler-body-heading {\\n\\tmargin: 0 0 0.25em 0;\\n\\tfont-weight: normal;\\n}\\n\\n.tc-global-tiddler-body-type {\\n\\tmargin: 0 0 0.25em 0;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour foreground>>;\\n}\\n\\n.tc-global-tiddler-body-details {\\n\\tbackground-color: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-global-tiddler-body pre {\\n\\tmargin: 0;\\n\\tborder: 1px solid \u003C\u003Ccolour foreground>>;\\n}\\n\\n/*\\n** Utility classes for SVG icons\\n*/\\n\\n.tc-fill-background {\\n\\tfill: \u003C\u003Ccolour background>>;\\n}\\n\\n.tc-network-activity-background {\\n\\tfill: \u003C\u003Ccolour network-activity-foreground>>;\\n}\\n\\n/*\\n** Flexbox utility classes\\n*/\\n\\n.tc-flex {\\n\\tdisplay: -webkit-flex;\\n\\tdisplay: flex;\\n}\\n\\n.tc-flex-column {\\n\\tflex-direction: column;\\n}\\n\\n.tc-flex-row {\\n\\tflex-direction: row;\\n}\\n\\n.tc-flex-grow-1 {\\n\\tflex-grow: 1;\\n}\\n\\n.tc-flex-grow-2 {\\n\\tflex-grow: 2;\\n}\\n\\n/*\\n** Other utility classes\\n*/\\n\\n/* Horizontal gaps */\\n\\n.tc-tiny-gap {\\n\\tmargin-left: .25em;\\n\\tmargin-right: .25em;\\n}\\n\\n.tc-tiny-gap-left {\\n\\tmargin-left: .25em;\\n}\\n\\n.tc-tiny-gap-right {\\n\\tmargin-right: .25em;\\n}\\n\\n.tc-small-gap {\\n\\tmargin-left: .5em;\\n\\tmargin-right: .5em;\\n}\\n\\n.tc-small-gap-left {\\n\\tmargin-left: .5em;\\n}\\n\\n.tc-small-gap-right {\\n\\tmargin-right: .5em;\\n}\\n\\n.tc-big-gap {\\n\\tmargin-left: 1em;\\n\\tmargin-right: 1em;\\n}\\n\\n.tc-big-gap-left {\\n\\tmargin-left: 1em;\\n}\\n\\n.tc-big-gap-right {\\n\\tmargin-right: 1em;\\n}\\n\\n.tc-word-break {\\n\\tword-break: break-all;\\n}\\n\\n/* Vertical gaps */\\n\\n.tc-tiny-v-gap-bottom {\\n\\tmargin-bottom: 3px;\\n}\\n\"},\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\",\"text\":\"15px\"},\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\",\"text\":\"22px\"},\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\"text\":\"14px\"},\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\"text\":\"20px\"},\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\"text\":\"0px\"},\"$:/themes/tiddlywiki/vanilla/metrics/storytop\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\"text\":\"0px\"},\"$:/themes/tiddlywiki/vanilla/metrics/storyright\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\"text\":\"770px\"},\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\"text\":\"770px\"},\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\",\"text\":\"686px\"},\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\",\"text\":\"960px\"},\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\":{\"title\":\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\",\"text\":\"350px\"},\"$:/themes/tiddlywiki/vanilla/options/stickytitles\":{\"title\":\"$:/themes/tiddlywiki/vanilla/options/stickytitles\",\"text\":\"no\"},\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\":{\"title\":\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\",\"text\":\"fixed-fluid\"},\"$:/themes/tiddlywiki/vanilla/options/codewrapping\":{\"title\":\"$:/themes/tiddlywiki/vanilla/options/codewrapping\",\"text\":\"pre-wrap\"},\"$:/themes/tiddlywiki/vanilla/reset\":{\"title\":\"$:/themes/tiddlywiki/vanilla/reset\",\"type\":\"text/css\",\"text\":\"/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\\n\\n/*\\nDocument\\n========\\n*/\\n\\n/**\\nUse a better box model (opinionated).\\n*/\\n\\n*,\\n*::before,\\n*::after {\\n box-sizing: border-box;\\n}\\n\\n/**\\nUse a more readable tab size (opinionated).\\n*/\\n\\n:root {\\n -moz-tab-size: 4;\\n tab-size: 4;\\n}\\n\\n/**\\n1. Correct the line height in all browsers.\\n2. Prevent adjustments of font size after orientation changes in iOS.\\n*/\\n\\nhtml {\\n line-height: 1.15; /* 1 */\\n -webkit-text-size-adjust: 100%; /* 2 */\\n}\\n\\n/*\\nSections\\n========\\n*/\\n\\n/**\\nRemove the margin in all browsers.\\n*/\\n\\nbody {\\n margin: 0;\\n}\\n\\n/**\\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\\n*/\\n\\nbody {\\n font-family:\\n system-ui,\\n -apple-system, /* Firefox supports this but not yet `system-ui` */\\n 'Segoe UI',\\n Roboto,\\n Helvetica,\\n Arial,\\n sans-serif,\\n 'Apple Color Emoji',\\n 'Segoe UI Emoji';\\n}\\n\\n/*\\nGrouping content\\n================\\n*/\\n\\n/**\\n1. Add the correct height in Firefox.\\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\\n*/\\n\\nhr {\\n height: 0; /* 1 */\\n color: inherit; /* 2 */\\n}\\n\\n/*\\nText-level semantics\\n====================\\n*/\\n\\n/**\\nAdd the correct text decoration in Chrome, Edge, and Safari.\\n*/\\n\\nabbr[title] {\\n text-decoration: underline dotted;\\n}\\n\\n/**\\nAdd the correct font weight in Edge and Safari.\\n*/\\n\\nb,\\nstrong {\\n font-weight: bolder;\\n}\\n\\n/**\\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\\n2. Correct the odd 'em' font sizing in all browsers.\\n*/\\n\\ncode,\\nkbd,\\nsamp,\\npre {\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Consolas,\\n 'Liberation Mono',\\n Menlo,\\n monospace; /* 1 */\\n font-size: 1em; /* 2 */\\n}\\n\\n/**\\nAdd the correct font size in all browsers.\\n*/\\n\\nsmall {\\n font-size: 80%;\\n}\\n\\n/**\\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\\n*/\\n\\nsub,\\nsup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n}\\n\\nsub {\\n bottom: -0.25em;\\n}\\n\\nsup {\\n top: -0.5em;\\n}\\n\\n/*\\nTabular data\\n============\\n*/\\n\\n/**\\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\\n*/\\n\\ntable {\\n text-indent: 0; /* 1 */\\n border-color: inherit; /* 2 */\\n}\\n\\n/*\\nForms\\n=====\\n*/\\n\\n/**\\n1. Change the font styles in all browsers.\\n2. Remove the margin in Firefox and Safari.\\n*/\\n\\nbutton,\\ninput,\\noptgroup,\\nselect,\\ntextarea {\\n font-family: inherit; /* 1 */\\n font-size: 100%; /* 1 */\\n line-height: 1.15; /* 1 */\\n margin: 0; /* 2 */\\n}\\n\\n/**\\nRemove the inheritance of text transform in Edge and Firefox.\\n1. Remove the inheritance of text transform in Firefox.\\n*/\\n\\nbutton,\\nselect { /* 1 */\\n text-transform: none;\\n}\\n\\n/**\\nCorrect the inability to style clickable types in iOS and Safari.\\n*/\\n\\nbutton,\\n[type='button'],\\n[type='reset'],\\n[type='submit'] {\\n -webkit-appearance: button;\\n}\\n\\n/**\\nRemove the inner border and padding in Firefox.\\n*/\\n\\n::-moz-focus-inner {\\n border-style: none;\\n padding: 0;\\n}\\n\\n/**\\nRestore the focus styles unset by the previous rule.\\n*/\\n\\n:-moz-focusring {\\n outline: 1px dotted ButtonText;\\n}\\n\\n/**\\nRemove the additional ':invalid' styles in Firefox.\\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\\n*/\\n\\n:-moz-ui-invalid {\\n box-shadow: none;\\n}\\n\\n/**\\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\\n*/\\n\\nlegend {\\n padding: 0;\\n}\\n\\n/**\\nAdd the correct vertical alignment in Chrome and Firefox.\\n*/\\n\\nprogress {\\n vertical-align: baseline;\\n}\\n\\n/**\\nCorrect the cursor style of increment and decrement buttons in Safari.\\n*/\\n\\n::-webkit-inner-spin-button,\\n::-webkit-outer-spin-button {\\n height: auto;\\n}\\n\\n/**\\n1. Correct the odd appearance in Chrome and Safari.\\n2. Correct the outline style in Safari.\\n*/\\n\\n[type='search'] {\\n -webkit-appearance: textfield; /* 1 */\\n outline-offset: -2px; /* 2 */\\n}\\n\\n/**\\nRemove the inner padding in Chrome and Safari on macOS.\\n*/\\n\\n::-webkit-search-decoration {\\n -webkit-appearance: none;\\n}\\n\\n/**\\n1. Correct the inability to style clickable types in iOS and Safari.\\n2. Change font properties to 'inherit' in Safari.\\n*/\\n\\n::-webkit-file-upload-button {\\n -webkit-appearance: button; /* 1 */\\n font: inherit; /* 2 */\\n}\\n\\n/*\\nInteractive\\n===========\\n*/\\n\\n/*\\nAdd the correct display in Chrome and Safari.\\n*/\\n\\nsummary {\\n display: list-item;\\n}\\n\"},\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\":{\"title\":\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\",\"text\":\"-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;\"},\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\":{\"title\":\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\",\"text\":\"\\\"SFMono-Regular\\\",Consolas,\\\"Liberation Mono\\\",Menlo,Courier,monospace\"},\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\":{\"title\":\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\",\"text\":\"fixed\"},\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\":{\"title\":\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\",\"text\":\"auto\"},\"$:/themes/tiddlywiki/vanilla/sticky\":{\"title\":\"$:/themes/tiddlywiki/vanilla/sticky\",\"code-body\":\"yes\",\"text\":\"\u003C$reveal state=\\\"$:/themes/tiddlywiki/vanilla/options/stickytitles\\\" type=\\\"match\\\" text=\\\"yes\\\">\\n``\\n.tc-tiddler-title {\\n\\tposition: -webkit-sticky;\\n\\tposition: -moz-sticky;\\n\\tposition: -o-sticky;\\n\\tposition: -ms-sticky;\\n\\tposition: sticky;\\n\\ttop: 0px;\\n\\tbackground: ``\u003C\u003Ccolour tiddler-background>>``;\\n\\tz-index: 500;\\n}\\n\\n``\\n\u003C$list filter=\\\"[range[100]]\\\">\\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`\u003C$text text=\u003C\u003CcurrentTiddler>>/>`) {\\nz-index: `\u003C$text text={{{ [[200]subtract\u003CcurrentTiddler>] }}}/>`;\\n}\\n`\\n\u003C/$list>\\n\u003C/$reveal>\\n\"}}}"}, {"created":"20230227185225098","text":"","creator":"_PSEUDO_","title":"AstroID","type":"image/png","modified":"20231007123102996","modifier":"_PSEUDO_","tags":"$:/isAttachment _PLAYER_ $:/isIpfs G1AstroID","_canonical_uri":"/ipfs/bafybeifbebc3ewnzrzbm44arddedbralegnxklhua5d5ymzaqtf2kaub7i","PASS":"_PASS_","HPASS":"_HPASS_","g1pub":"_G1PUB_","astronautens":"_ASTRONAUTENS_"}, {"created":"20210804081616558","text":"Astroport is a Web3 engine hosting TW on IPFS, and more...\n\nhttps://pad.p2p.legal/p/G1Fablab#/\n\n> DO NOT DELETE THIS TIDDLER (it contains parameters needed to plug this TW to UPlanet)","creator":"_PSEUDO_","title":"Astroport","modified":"20231007132609060","tags":"_PLAYER_","g1pub":"_G1PUB_","qrsec":"_QRSEC_","astroport":"_ASTROPORT_","birthdate":"_BIRTHDATE_","pseudo":"_PSEUDO_","modifier":"_PSEUDO_","chain":"_CHAIN_","moats":"_MOATS_","twmodel":"_TWMODEL_","astronautens":"_ASTRONAUTENS_"}, {"created":"20231007122751112","text":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAHLA8QDAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9Q64jzwoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo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MPws8TQeLLfQtW8SX1pL51oviC8S5gt3ByrCJI0RivbeGx16gEfWZ14ucS51hnhZTjSjJWfs04tr1bbV+tmvuMoYanB3PqSvzI6AoA89+NfwF+F/7QXhUeEfif4dTUbaGTzrS4jcxXNnJ3eGUcoSAARyrAAEHFe/w7xNmfC2K+t5ZU5W9Gt4yXaS2fl1XRoipTjUVpHzlov/AASc/Zb0rU1v76+8caxAGDGyvdWhWEj+6TBBHJj/AIHn3r9CxHjhxPXp8kI0oP8AmjB3/wDJpSX4GCwdNdz6z8F+CPCPw68N2fg/wN4estE0awUrb2dpGEjTJyT6liSSWOSSckk1+V5jmWLzbEyxeOqOdSW7bu/+G7LZHTGKirI3K4hnB/FL4V2PxFtYZo7oWep2gKwzldyshOSjj0zyCOmT1ziuvC4t4Z23TPseEuLq3DNSUXHnpT3js0+68+66nkFr+zZ46luxDdX2lQQZ+aYTO/HqF2gn8cV6TzKkldJn6dW8UcnhT5qcJyl2sl97v/mey/D74T+G/h+pubTfealImyS8mADY7hF6IPzPqTXmYjFzxGj0XY/LOI+MMfxG/Z1fcpJ3UV+bfV/cuyO2rlPkwoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAP/9k=","modified":"20231007133938663","creator":"_PSEUDO_","modifier":"_PSEUDO_","title":"Dessin de _PLAYER_","type":"image/jpeg","president":"_PLAYER_","tags":"G1DessinDeMoa moa $:/isAttachment $:/isEmbedded _PLAYER_","g1pub":"_G1PUB_","tw":"_TW_","player":"_PLAYER_"}, {"created":"20220504005648767","text":"","creator":"_PSEUDO_","title":"G1Visa","type":"image/jpeg","modified":"20231007122810364","tags":"$:/isAttachment $:/isIpfs _PLAYER_","_canonical_uri":"/ipfs/bafybeidhghlcx3zdzdah2pzddhoicywmydintj4mosgtygr6f2dlfwmg7a","modifier":"_PSEUDO_","g1pub":"_G1PUB_","tw":"_TW_","player":"_PLAYER_"}, -{"created":"20231007125629731","text":"\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to this ~TiddlyWiki saved on [[UPlanet|GPS]] in the [[IPFS|https://ipfs.tech]] powered by [[Astroport|Astroport]]\n\nhttps://qo-op.com.\n\n* Scan [[AstroID]] to activate or desactivate LOGIN\n\nIMPORTANT\n\n* Print your public [[G1Visa]] and private [[AstroID]] Keys\n* Update [[Dessin de _PLAYER_]] and make your note visual \n\nWant to join UPlanet IPFS hosting community?\nSend an email to support@qo-op.com \n\n!! Set up this ~TiddlyWiki\n\n\u003Cdiv class=\"tc-control-panel\">\n\n|tc-table-no-border tc-first-col-min-width tc-first-link-nowrap|k\n| \u003C$link to=\"$:/SiteTitle\">\u003C\u003Clingo Title/Prompt>>\u003C/$link>|\u003C$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n| \u003C$link to=\"$:/SiteSubtitle\">\u003C\u003Clingo Subtitle/Prompt>>\u003C/$link>|\u003C$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|^ \u003C$link to=\"$:/DefaultTiddlers\">\u003C\u003Clingo DefaultTiddlers/Prompt>>\u003C/$link>\u003Cbr>\u003C\u003Clingo DefaultTiddlers/TopHint>>|\u003C$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/>\u003Cbr>//\u003C\u003Clingo DefaultTiddlers/BottomHint>>// |\n\u003C/div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n","title":"GettingStarted","modified":"20231007134843370","tags":"_PLAYER_"}, -{"created":"20231007123717877","text":"\u003C$leafmap\ntileControl\ntile='sat'\nzoom='12'\nplaces='{\"point\":\"44.2301, 1.6518\"}'\n/>\n\n! UPlanet\n\u003C\u003C\u003C\nEdit to modify Umap sector : https://qo-op.com\n\u003C\u003C\u003C\n","tags":"_PLAYER_","title":"GPS","modified":"20231007124915207","lat":"44.2301","lon":"1.6518","umap":"k51qzi5uqu5djg1gqzujq5p60w25mi235gdg0lgkk5qztkfrpi5c22oolrriyu"}, +{"created":"20231007125629731","text":"\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to this ~TiddlyWiki registered on [[UPlanet|GPS]] in the [[IPFS|https://ipfs.tech]] powered by [[Astroport|Astroport]]\n\nhttps://qo-op.com.\n\n* Scan [[AstroID]] to activate or desactivate LOGIN\n\nIMPORTANT\n\n* Print your public [[G1Visa]] and private [[AstroID]] Keys\n* Update [[Dessin de _PLAYER_]] and make your note visual \n\nWant to join UPlanet IPFS hosting community?\nSend an email to support@qo-op.com \n\n!! Set up this ~TiddlyWiki\n\n\u003Cdiv class=\"tc-control-panel\">\n\n|tc-table-no-border tc-first-col-min-width tc-first-link-nowrap|k\n| \u003C$link to=\"$:/SiteTitle\">\u003C\u003Clingo Title/Prompt>>\u003C/$link>|\u003C$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n| \u003C$link to=\"$:/SiteSubtitle\">\u003C\u003Clingo Subtitle/Prompt>>\u003C/$link>|\u003C$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|^ \u003C$link to=\"$:/DefaultTiddlers\">\u003C\u003Clingo DefaultTiddlers/Prompt>>\u003C/$link>\u003Cbr>\u003C\u003Clingo DefaultTiddlers/TopHint>>|\u003C$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/>\u003Cbr>//\u003C\u003Clingo DefaultTiddlers/BottomHint>>// |\n\u003C/div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n","title":"GettingStarted","modified":"20231009075018739","tags":"_PLAYER_"}, +{"created":"20231007123717877","text":"\u003C$leafmap\ntileControl\ntile='sat'\nzoom='12'\nplaces='{\"point\":\"44.2301, 1.6518\"}'\n/>\n\u003Ca target='_blank' href='/ipns/k51qzi5uqu5djg1gqzujq5p60w25mi235gdg0lgkk5qztkfrpi5c22oolrriyu'>UMap_44.2301_1.6518\u003C/a>\n\n! UPlanet\n\u003C\u003C\u003C\nEdit to modify Umap sector : https://qo-op.com\n\u003C\u003C\u003C\n","tags":"_PLAYER_","title":"GPS","modified":"20231009074938912","lat":"44.2301","lon":"1.6518","umap":"/ipns/k51qzi5uqu5djg1gqzujq5p60w25mi235gdg0lgkk5qztkfrpi5c22oolrriyu"}, {"created":"20220626175330872","text":"MadeInZion is a worldwide community of people maintaining peace and restoring harmony\n\n> DO NOT DELETE THIS \"TIDDLER\" {{{ [{$:/info/url/protocol}match[http:]then[ipfs]else[online]] }}}\n\n","creator":"_PSEUDO_","title":"MadeInZion","modified":"20231007133810173","tags":"_PLAYER_","player":"_PLAYER_","astroport":"_ASTROPORT_","number":"_NUMBER_","secret":"_SECRET_","wishkey":"_WISHKEY_","modifier":"_PSEUDO_","sector":"_SECTOR_","root":"_ROOT_","dao":"_DAO_"} ] diff --git a/templates/register.html b/templates/register.html index 8f57beb3..d639aa91 100644 --- a/templates/register.html +++ b/templates/register.html @@ -124,7 +124,7 @@ header { -

    Web3 - UPlanet - PlayGround ___

    +
    ___ Astroport.ONE : Web3 - IPFS - PlayGround ___