Created
November 13, 2021 14:53
-
-
Save bzimor/db50197132e069928cde1a96b8dc8c61 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| THIS IS A GENERATED/BUNDLED FILE BY ROLLUP | |
| if you want to view the source visit the plugins github repository | |
| */ | |
| 'use strict'; | |
| var obsidian = require('obsidian'); | |
| /*! ***************************************************************************** | |
| Copyright (c) Microsoft Corporation. | |
| Permission to use, copy, modify, and/or distribute this software for any | |
| purpose with or without fee is hereby granted. | |
| THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | |
| REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | |
| AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | |
| INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | |
| LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | |
| OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | |
| PERFORMANCE OF THIS SOFTWARE. | |
| ***************************************************************************** */ | |
| function __awaiter(thisArg, _arguments, P, generator) { | |
| function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | |
| return new (P || (P = Promise))(function (resolve, reject) { | |
| function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | |
| function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | |
| function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | |
| step((generator = generator.apply(thisArg, _arguments || [])).next()); | |
| }); | |
| } | |
| const DEFAULT_SETTINGS = { | |
| expansionMode: 'expanded', | |
| ignoreNulls: false, | |
| nullValue: '', | |
| skipKey: 'metatable', | |
| ignoredKeys: [], | |
| filterKeys: ['metatable', 'frontmatter'], | |
| filterMode: 'ignore', | |
| autolinks: false, | |
| vault: null, | |
| }; | |
| class MetatableSettingTab extends obsidian.PluginSettingTab { | |
| constructor(app, plugin) { | |
| super(app, plugin); | |
| this.plugin = plugin; | |
| } | |
| display() { | |
| return __awaiter(this, void 0, void 0, function* () { | |
| const { containerEl, plugin } = this; | |
| containerEl.empty(); | |
| containerEl.createEl('h2', { text: 'Metatable Settings' }); | |
| new obsidian.Setting(containerEl) | |
| .setName('Expansion level') | |
| .setDesc('Level of expansion of the metatable tree') | |
| .addDropdown(drop => drop | |
| .addOption('expanded', 'Fully expanded') | |
| .addOption('leaf-collapsed', 'Collapse leafs') | |
| .addOption('all-collapsed', 'Collapse all') | |
| .setValue(plugin.settings.expansionMode) | |
| .onChange((value) => __awaiter(this, void 0, void 0, function* () { | |
| plugin.settings.expansionMode = value; | |
| yield plugin.saveSettings(); | |
| }))); | |
| new obsidian.Setting(containerEl) | |
| .setName('Skip key') | |
| .setDesc('When this key is found and `true`, the metatable will not be displayed') | |
| .addText(text => text | |
| .setValue(plugin.settings.skipKey) | |
| .onChange((value) => __awaiter(this, void 0, void 0, function* () { | |
| plugin.settings.skipKey = value; | |
| yield plugin.saveSettings(); | |
| }))); | |
| containerEl.createEl('h3', { text: 'Nulls' }); | |
| new obsidian.Setting(containerEl) | |
| .setName('Ignore null values') | |
| .setDesc('Ignore any member with a null value.') | |
| .addToggle(setting => setting | |
| .setValue(plugin.settings.ignoreNulls) | |
| .onChange((value) => __awaiter(this, void 0, void 0, function* () { | |
| plugin.settings.ignoreNulls = value; | |
| yield plugin.saveSettings(); | |
| this.display(); | |
| }))); | |
| if (!plugin.settings.ignoreNulls) { | |
| new obsidian.Setting(containerEl) | |
| .setName('Null value') | |
| .setDesc('Text to show when a key has no value. Defaults to nothing') | |
| .addText(text => text | |
| .setValue(plugin.settings.nullValue) | |
| .onChange((value) => __awaiter(this, void 0, void 0, function* () { | |
| plugin.settings.nullValue = value; | |
| yield plugin.saveSettings(); | |
| }))); | |
| } | |
| containerEl.createEl('h3', { text: 'Filter' }); | |
| new obsidian.Setting(containerEl) | |
| .setName('Filter mode') | |
| .setDesc('Either ignore or keep the filter keys') | |
| .addDropdown(drop => drop | |
| .addOption('ignore', 'Ignore') | |
| .addOption('keep', 'Keep') | |
| .setValue(plugin.settings.filterMode) | |
| .onChange((value) => __awaiter(this, void 0, void 0, function* () { | |
| plugin.settings.filterMode = value; | |
| yield plugin.saveSettings(); | |
| }))); | |
| // XXX: Remove in 0.11.0 | |
| if (plugin.settings.ignoredKeys.length > 0) { | |
| plugin.settings.filterKeys = plugin.settings.ignoredKeys; | |
| yield plugin.saveSettings(); | |
| } | |
| new obsidian.Setting(containerEl) | |
| .setName('Filter keys') | |
| .setDesc('Any key found in this comma-separated list will be either ignored or kept according to the filter mode') | |
| .addText(text => text | |
| .setValue(plugin.settings.filterKeys.join(', ')) | |
| .onChange((value) => __awaiter(this, void 0, void 0, function* () { | |
| plugin.settings.filterKeys = value.split(',').map(v => v.trim()); | |
| yield plugin.saveSettings(); | |
| }))); | |
| containerEl.createEl('h3', { text: 'Experimental' }); | |
| new obsidian.Setting(containerEl) | |
| .setName('Autolink') | |
| .setDesc('Enables autolinks for wikilinks `[[target]]`, frontmatter links `%target%` and local links `./deep/target`') | |
| .addToggle(setting => setting | |
| .setValue(plugin.settings.autolinks) | |
| .onChange((value) => __awaiter(this, void 0, void 0, function* () { | |
| plugin.settings.autolinks = value; | |
| yield plugin.saveSettings(); | |
| }))); | |
| }); | |
| } | |
| } | |
| /** | |
| * A store of rules to apply to set members. | |
| * | |
| * Only one rule can be assigned to a member. If you add two rules against the | |
| * same member key it will only keep the last one. | |
| * | |
| * ## Example | |
| * | |
| * ``` | |
| * const rules = new RuleStore() | |
| * const tagsRule = { toHtml: tagslist, foldable: false } | |
| * rules.set('tags', tagsRule) | |
| * ``` | |
| */ | |
| class RuleStore extends Map { | |
| } | |
| function isEmptyArray(value) { | |
| if (typeof value === 'string') { | |
| return value === '[]'; | |
| } | |
| if (Array.isArray(value) && value.length === 0) { | |
| return true; | |
| } | |
| return false; | |
| } | |
| function toggle(trigger) { | |
| const isExpanded = trigger.getAttribute('aria-expanded') == 'true'; | |
| trigger.setAttribute('aria-expanded', String(!isExpanded)); | |
| } | |
| function clickHandler(event, searchFn, openLinkFn) { | |
| const trigger = event.target; | |
| if (trigger === null || trigger === void 0 ? void 0 : trigger.hasAttribute('aria-expanded')) { | |
| event.stopPropagation(); | |
| event.preventDefault(); | |
| toggle(trigger); | |
| return; | |
| } | |
| if (trigger === null || trigger === void 0 ? void 0 : trigger.hasAttribute('href')) { | |
| event.stopPropagation(); | |
| const href = trigger.getAttribute('href'); | |
| if (trigger.hasClass('internal-link')) { | |
| event.preventDefault(); | |
| openLinkFn(trigger.dataset.href, ''); | |
| } | |
| if (trigger.hasClass('tag')) { | |
| event.preventDefault(); | |
| searchFn(`tag:${href}`); | |
| } | |
| } | |
| } | |
| function keyHandler(event) { | |
| const trigger = event.target; | |
| if ((event.code == 'Space' || event.code == 'Enter') && (trigger === null || trigger === void 0 ? void 0 : trigger.hasAttribute('aria-expanded'))) { | |
| event.stopPropagation(); | |
| event.preventDefault(); | |
| toggle(trigger); | |
| } | |
| } | |
| function externalLink(value) { | |
| var _a, _b; | |
| const a = document.createElement('a'); | |
| // @ts-ignore | |
| (_a = a.part) === null || _a === void 0 ? void 0 : _a.add('link'); | |
| // @ts-ignore | |
| (_b = a.part) === null || _b === void 0 ? void 0 : _b.add('external-link'); | |
| a.classList.add('external-link'); | |
| a.setAttribute('target', '_blank'); | |
| a.setAttribute('rel', 'noopener'); | |
| a.setAttribute('href', value); | |
| a.append(value); | |
| return a; | |
| } | |
| function obsidianUrl(vaultName, fileName) { | |
| return `obsidian://open?vault=${vaultName}&file=${encodeURI(obsidian.getLinkpath(fileName))}`; | |
| } | |
| function internalLink(url) { | |
| var _a, _b; | |
| const a = document.createElement('a'); | |
| const label = url.searchParams.get('file'); | |
| a.dataset.href = label; | |
| a.setAttribute('href', label); | |
| // @ts-ignore | |
| (_a = a.part) === null || _a === void 0 ? void 0 : _a.add('link'); | |
| // @ts-ignore | |
| (_b = a.part) === null || _b === void 0 ? void 0 : _b.add('internal-link'); | |
| a.classList.add('internal-link'); | |
| a.setAttribute('target', '_blank'); | |
| a.setAttribute('rel', 'noopener'); | |
| a.append(label); | |
| return a; | |
| } | |
| /** | |
| /* Creates a link for internal links from a string of the form `[[text]]`. | |
| */ | |
| function wikiLink(value, vaultName) { | |
| const cleanValue = value.slice(2, -2); | |
| const url = new URL(obsidianUrl(vaultName, cleanValue)); | |
| return internalLink(url); | |
| } | |
| /** | |
| /* Creates a link for internal links from a string of the form `%text%`. | |
| */ | |
| function frontmatterLink(value, vaultName) { | |
| const cleanValue = value.slice(1, -1); | |
| const url = new URL(obsidianUrl(vaultName, cleanValue)); | |
| return internalLink(url); | |
| } | |
| /** | |
| * Creates a link for local paths. | |
| */ | |
| function localLink(value, vaultName) { | |
| const url = new URL(obsidianUrl(vaultName, value)); | |
| return internalLink(url); | |
| } | |
| function isOpen(mode, depth) { | |
| if (mode == 'expanded') { | |
| return true; | |
| } | |
| // Keep the root open when leafs are collapsed | |
| if (mode == 'leaf-collapsed' && depth == 0) { | |
| return true; | |
| } | |
| // all-collapsed | |
| return false; | |
| } | |
| function isObsidianUrl(url) { | |
| return (url instanceof URL && url.protocol == 'obsidian:'); | |
| } | |
| function isUrl(url) { | |
| const allowedProtocols = ['http:', 'https:', 'evernote:']; | |
| return (url instanceof URL && allowedProtocols.some(protocol => url.protocol == protocol)); | |
| } | |
| function isLocalLink(value) { | |
| return value.startsWith('./'); | |
| } | |
| function tryUrl(value) { | |
| try { | |
| return new URL(value); | |
| } | |
| catch (_) { | |
| } | |
| } | |
| function isWikiLink(value) { | |
| return (value.startsWith('[[') && value.endsWith(']]')); | |
| } | |
| function isFrontmatterLink(value) { | |
| return (value.startsWith('%') && value.endsWith('%')); | |
| } | |
| function enrichValue(value, context) { | |
| const { settings, vaultName } = context; | |
| const { autolinks } = settings; | |
| const cleanValue = value.toString().trim(); | |
| if (autolinks) { | |
| if (isWikiLink(cleanValue)) { | |
| return wikiLink(cleanValue, vaultName); | |
| } | |
| if (isFrontmatterLink(cleanValue)) { | |
| return frontmatterLink(cleanValue, vaultName); | |
| } | |
| if (isLocalLink(cleanValue)) { | |
| return localLink(cleanValue, vaultName); | |
| } | |
| } | |
| const url = tryUrl(cleanValue); | |
| if (isObsidianUrl(url)) { | |
| return internalLink(url); | |
| } | |
| if (isUrl(url)) { | |
| return externalLink(cleanValue); | |
| } | |
| return value.toString(); | |
| } | |
| function isNully(value) { | |
| if (typeof value == 'string') { | |
| return value.length == 0; | |
| } | |
| return value == null; | |
| } | |
| /** | |
| * A set member with a scalar value. | |
| */ | |
| function leafMember(label, data, context) { | |
| var _a, _b; | |
| const { rules, settings } = context; | |
| const root = document.createElement('tr'); | |
| const key = document.createElement('th'); | |
| const value = document.createElement('td'); | |
| const rule = rules.get(label); | |
| const datum = (rules.has(label) && !isNully(data)) | |
| ? rule.toHtml(data, rule) | |
| : enrichValue(data, context); | |
| // XXX: Note that `part` is an `Element` extension in draft. Checking for | |
| // undefined lets us get away with plain jest dom testing. | |
| // @ts-ignore | |
| (_a = key.part) === null || _a === void 0 ? void 0 : _a.add('key'); | |
| key.classList.add('key'); | |
| key.append(label); | |
| // @ts-ignore | |
| (_b = value.part) === null || _b === void 0 ? void 0 : _b.add('value'); | |
| value.classList.add('value'); | |
| value.append(datum); | |
| root.classList.add('member'); | |
| root.append(key); | |
| root.append(value); | |
| return root; | |
| } | |
| /** | |
| * A set member with a complex value. | |
| */ | |
| function nodeMember(label, value, context) { | |
| const root = details(label, value, Object.assign(Object.assign({}, context), { depth: context.depth + 1 })); | |
| root.classList.add('member'); | |
| return root; | |
| } | |
| /** | |
| * A set member. | |
| */ | |
| function member(label, value, context) { | |
| const { settings } = context; | |
| const patchedValue = value == null ? settings.nullValue : value; | |
| if (typeof patchedValue == 'object') { | |
| return nodeMember(label, value, context); | |
| } | |
| return leafMember(label, patchedValue, context); | |
| } | |
| /** | |
| * A set of members. | |
| */ | |
| function set(data, context) { | |
| const { settings, depth } = context; | |
| const { filterMode, filterKeys, ignoreNulls } = settings; | |
| const valueContext = Object.assign(Object.assign({}, context), { depth: depth + 1 }); | |
| const root = document.createElement('table'); | |
| root.classList.add('set'); | |
| Object.entries(data).forEach(([label, value]) => { | |
| if (ignoreNulls && (value == null || isEmptyArray(value))) | |
| return; | |
| if (filterMode == 'ignore') { | |
| if (filterKeys.some(key => key == label)) | |
| return; | |
| } | |
| if (filterMode == 'keep') { | |
| if (!filterKeys.some(key => key == label)) | |
| return; | |
| } | |
| root.append(member(label, value, valueContext)); | |
| }); | |
| return root; | |
| } | |
| /** | |
| * A list of members. | |
| */ | |
| function list(data, context) { | |
| const { settings, depth } = context; | |
| const valueContext = Object.assign(Object.assign({}, context), { depth: depth + 1 }); | |
| const root = document.createElement('ul'); | |
| data.forEach((item) => { | |
| let value; | |
| const li = document.createElement('li'); | |
| if (Array.isArray(item)) { | |
| value = list(item, valueContext); | |
| } | |
| else if (typeof item == 'object') { | |
| value = set(item, valueContext); | |
| } | |
| else { | |
| value = enrichValue(item, valueContext); | |
| } | |
| li.append(value); | |
| root.append(li); | |
| }); | |
| return root; | |
| } | |
| function ordinaryValue(data, context) { | |
| return Array.isArray(data) | |
| ? list(data, context) | |
| : set(data, context); | |
| } | |
| /** | |
| * A collapsible group. | |
| */ | |
| function details(label, data, context) { | |
| var _a, _b; | |
| const { settings, rules, depth } = context; | |
| const { mode } = settings; | |
| const root = document.createElement('tr'); | |
| const key = document.createElement('th'); | |
| const value = document.createElement('td'); | |
| const rule = rules.get(label); | |
| const valueId = `${label}-${depth}`; | |
| const datum = (rules.has(label) && !isNully(data)) | |
| ? rule.toHtml(data, rule) | |
| : ordinaryValue(data, Object.assign(Object.assign({}, context), { depth: depth + 1 })); | |
| // @ts-ignore | |
| (_a = key.part) === null || _a === void 0 ? void 0 : _a.add('key'); | |
| key.classList.add('key'); | |
| key.append(label); | |
| root.append(key); | |
| // @ts-ignore | |
| (_b = value.part) === null || _b === void 0 ? void 0 : _b.add('value'); | |
| value.classList.add('value'); | |
| value.setAttribute('id', valueId); | |
| value.append(datum); | |
| root.append(value); | |
| if (rule == undefined || rule.foldable) { | |
| const marker = document.createElement('div'); | |
| key.classList.add('toggle'); | |
| key.setAttribute('role', 'button'); | |
| key.setAttribute('aria-expanded', String(isOpen(mode, depth))); | |
| key.setAttribute('aria-controls', valueId); | |
| key.setAttribute('tabindex', '0'); | |
| marker.classList.add('marker'); | |
| value.append(marker); | |
| } | |
| return root; | |
| } | |
| function sheath(data, context) { | |
| const { settings } = context; | |
| const root = document.createElement('details'); | |
| const summary = document.createElement('summary'); | |
| const value = set(data, context); | |
| if (isOpen(settings.mode, 0)) { | |
| root.setAttribute('open', ''); | |
| } | |
| summary.append('Metadata'); | |
| root.classList.add('metatable'); | |
| root.append(summary); | |
| root.append(value); | |
| return root; | |
| } | |
| function metatable(data, context) { | |
| const { searchFn, openLinkFn, settings } = context; | |
| const fragment = new DocumentFragment(); | |
| const root = sheath(data, context); | |
| root.addEventListener('click', (e) => clickHandler(e, searchFn, openLinkFn)); | |
| root.addEventListener('keydown', keyHandler); | |
| fragment.append(root); | |
| return fragment; | |
| } | |
| /** | |
| * Transforms a list of dirty tags into HTML. | |
| */ | |
| function taglist(data, rule) { | |
| const list = normaliseTags(data); | |
| // No valid tags found. | |
| if (list.length == 0) | |
| return null; | |
| const root = document.createElement('ul'); | |
| root.classList.add('tag-list'); | |
| list.forEach((item) => { | |
| const li = document.createElement('li'); | |
| const value = tag(item); | |
| li.append(value); | |
| root.append(li); | |
| }); | |
| return root; | |
| } | |
| /** | |
| * Normalises a list of tags as an array of strings. | |
| */ | |
| function normaliseTags(data) { | |
| if (data == null) { | |
| return []; | |
| } | |
| if (typeof data == 'string') { | |
| return data.split(',').map(x => x.trim()).filter(x => x && x.length != 0); | |
| } | |
| return data.filter(x => x && x.length != 0); | |
| } | |
| function tag(value) { | |
| var _a, _b; | |
| const a = document.createElement('a'); | |
| a.classList.add('tag'); | |
| // XXX: Note that `part` is an `Element` extension in draft. Checking for | |
| // undefined lets us get away with plain jest dom testing. | |
| // @ts-ignore | |
| (_a = a.part) === null || _a === void 0 ? void 0 : _a.add('tag'); | |
| // @ts-ignore | |
| (_b = a.part) === null || _b === void 0 ? void 0 : _b.add(encodeURI(value)); | |
| a.setAttribute('target', '_blank'); | |
| a.setAttribute('rel', 'noopener'); | |
| a.setAttribute('href', `#${value}`); | |
| a.append(`${value}`); | |
| return a; | |
| } | |
| var styles = ":host-context(.theme-light) {\n --metatable-foreground: var(--text-muted, darkslategrey);\n --metatable-key-background: var(--background-primary-alt, #f3f3f3);\n --metatable-key-border-color: var(--background-modifier-border, lightgrey);\n --metatable-key-border-color-focus: orange;\n --metatable-key-focus: var(--background-match-highlight, lightyellow);\n --metatable-tag-background: var(--background-primary-alt, #f3f3f3);\n --metatable-link-color: var(--text-accent, #705dcf);\n --metatable-link-color-hover: var(--text-accent-hover, #8875ff);\n}\n\n:host-context(.theme-dark) {\n --metatable-foreground: var(--text-muted, #999);\n --metatable-key-background: var(--background-primary-alt, #111);\n --metatable-key-border-color: var(--background-modifier-border, #333);\n --metatable-key-border-color-focus: orange;\n --metatable-key-focus: black;\n --metatable-tag-background: var(--background-primary-alt, #111);\n --metatable-link-color: var(--text-accent, #705dcf);\n --metatable-link-color-hover: var(--text-accent-hover, #8875ff);\n}\n\n:host {\n --metatable-collapsed-symbol: \"▶︎\";\n --metatable-expanded-symbol: \"▼\";\n --metatable-font-family: var(--text, sans-serif);\n --metatable-font-size: var(--font-small, 13px);\n --metatable-key-border-width: 2px;\n --metatable-mark-symbol: \"…\";\n --metatable-value-background: transparent;\n --metatable-background: transparent;\n --metatable-tag-symbol: \"\";\n --metatable-external-link-icon: url(app://obsidian.md/public/images/874d8b8e340f75575caa.svg);\n --metatable-external-link-color: var(--metatable-link-color);\n --metatable-external-link-color-hover: var(--metatable-link-color-hover);\n --metatable-internal-link-icon: none;\n --metatable-internal-link-color: var(--metatable-link-color);\n --metatable-internal-link-color-hover: var(--metatable-link-color-hover);\n}\n\n\n* {\n box-sizing: border-box;\n}\n\ndetails {\n border: 1px solid #424958;\nborder-radius: 4px;\npadding: 6px 14px;\nbackground-color: var(--metatable-background);\n color: var(--metatable-foreground);\n font-family: var(--metatable-font-family);\n font-size: var(--metatable-font-size);\n}\n\nsummary {\n cursor: pointer;\n text-transform: uppercase;\n padding: 8px;\nborder-bottom: transparent\n}\ndetails[open] > summary {\nborder-bottom: 1px solid #424958;\n}\n\nsummary:focus {\n outline: none;\n}\n\nsummary:focus-visible {\n outline: none;\n background-color: var(--metatable-key-focus)\n}\n\n.set {\n background-color: var(--metatable-background);\n grid-gap: 2px;\n margin-top: 0.4rem;\n}\n\n.member {\n display: grid;\n grid-gap: 2px;\n grid-template-columns: minmax(0, 1fr) minmax(0, 4fr);\n grid-template-areas: \"key value\";\n}\n\n.key[role=button] {\n cursor: pointer;\n}\n\n.member .key {\n background-color: var(--metatable-key-background);\n border-right: var(--metatable-key-border-width) solid var(--metatable-key-border-color);\n grid-template-columns: 10px auto;\n grid-gap: 0.4rem;\n font-weight: bold;\n grid-area: key;\n overflow: hidden;\n padding: 0.4rem;\n text-align: left;\n}\n\n.member .value {\n background-color: var(--metatable-value-background);\n grid-area: value;\n margin: 0;\n overflow: auto;\n padding: 0.4rem;\n}\n\n.member .key:focus {\n outline: none;\n}\n\n.member .key:focus-visible {\n outline: none;\n border-right-color: var(--metatable-key-border-color-focus);\n background-color: var(--metatable-key-focus);\n}\n\n.value ul {\n margin: 0;\n padding: 0;\n}\n\n.value li {\n margin-left: 1rem;\n}\n\n.key[aria-expanded]::before {\n font-size: 0.6rem;\n padding-top: 0.3rem;\n}\n\n.key[aria-expanded=true]::before {\n content: var(--metatable-expanded-symbol);\n}\n\n.key[aria-expanded=false]::before {\n content: var(--metatable-collapsed-symbol);\n}\n\n.key[aria-expanded=false] + .value > :first-child {\n display: none;\n}\n\n.key[aria-expanded=false] + .value > .marker::after {\n content: var(--metatable-mark-symbol);\n display: block;\n}\n\n@media screen and (min-width: 400px) and (max-width: 550px) {\n .member {\n grid-template-columns: minmax(0, 1.5fr) minmax(0, 3fr);\n }\n .member .member {\n grid-template-areas: \"key key\" \"value value\";\n }\n\n .member .member .key {\n border-right: none;\n border-bottom: var(--metatable-key-border-width) solid var(--metatable-key-border-color);\n }\n\n}\n\n@media screen and (max-width: 400px) {\n .member {\n }\n\n .member .key {\n border-right: none;\n border-bottom: var(--metatable-key-border-width) solid var(--metatable-key-border-color);\n }\n}\n\n/* Mappers */\n\n.tag-list li {\n display: inline-block;\n margin: 0 0.4rem 0 2px;\n}\n\n.tag {\n background-color: var(--metatable-tag-background);\n border-radius: 1rem;\n color: var(--metatable-foreground);\n display: inline-block;\n padding: 0.1rem 0.6rem;\n text-decoration: none;\n}\n\n.tag::before {\n content: var(--metatable-tag-symbol);\n}\n\n.tag:hover {\n filter: brightness(0.8);\n}\n\n.tag:focus, .external-link:focus, .internal-link:focus {\n outline: none;\n}\n\n.tag:focus-visible, .external-link:focus-visible, .internal-link:focus-visible {\n outline: none;\n background-color: var(--metatable-key-focus)\n}\n\n.external-link {\n color: var(--metatable-external-link-color);\n display: inline-block;\n white-space: nowrap;\n}\n\n.external-link::after {\n content: var(--metatable-external-link-icon);\n display: inline-block;\n margin-left: 0.3rem;\n vertical-align: sub;\n}\n\n.external-link:hover {\n color: var(--metatable-external-link-color-hover);\n}\n\n.internal-link {\n color: var(--metatable-internal-link-color);\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 450px;\n white-space: nowrap;\n}\n\n.internal-link::after {\n content: var(--metatable-internal-link-icon);\n display: inline-block;\n margin-left: 0.3rem;\n vertical-align: sub;\n}\n\n.internal-link:hover {\n color: var(--metatable-internal-link-color-hover);\n}\n"; | |
| function log(msg) { | |
| console.log(`metatable: ${msg}`); | |
| } | |
| function createMetatable(el, data, context) { | |
| const wrapper = el.createEl('div'); | |
| wrapper.classList.add('obsidian-metatable'); | |
| wrapper.attachShadow({ mode: 'open' }); | |
| const fragment = new DocumentFragment(); | |
| fragment.createEl('style', { text: styles }); | |
| fragment.append(metatable(data, context)); | |
| wrapper.shadowRoot.append(fragment); | |
| } | |
| function isEmpty(data) { | |
| return Object.entries(data) | |
| .every(([_, value]) => value == null || isEmptyArray(value)); | |
| } | |
| function filterSet(data, filterKeys, filterMode) { | |
| const filterFn = filterMode == 'ignore' | |
| ? (x => !x) | |
| : (x => x); | |
| const newData = Object.entries(data) | |
| .filter(([key, _value]) => filterFn(filterKeys.some(x => x == key))); | |
| return Object.fromEntries(newData); | |
| } | |
| function frontmatterProcessor(el, ctx) { | |
| return __awaiter(this, void 0, void 0, function* () { | |
| const plugin = this; | |
| const frontmatter = yield el.querySelector('.frontmatter'); | |
| if (frontmatter !== null) { | |
| const target = el.querySelector('.frontmatter-container'); | |
| target.removeAttribute('class'); | |
| // Prevents an undesired `display: none` if `tags` is not present. | |
| target.removeAttribute('style'); | |
| target.empty(); | |
| // @ts-ignore | |
| const searchFn = plugin.app.internalPlugins.getPluginById('global-search').instance.openGlobalSearch.bind(plugin); | |
| const openLinkFn = plugin.app.workspace.openLinkText.bind(plugin.app.workspace); | |
| const { ignoreNulls, filterMode, filterKeys, skipKey } = plugin.settings; | |
| const rules = new RuleStore(); | |
| rules.set('tags', { | |
| toHtml: taglist, | |
| foldable: false, | |
| }); | |
| const context = { | |
| vaultName: plugin.app.vault.getName(), | |
| rules, | |
| searchFn, | |
| openLinkFn, | |
| settings: { | |
| mode: plugin.settings.expansionMode, | |
| ignoreNulls, | |
| nullValue: plugin.settings.nullValue, | |
| filterKeys, | |
| filterMode, | |
| autolinks: plugin.settings.autolinks, | |
| }, | |
| depth: 0, | |
| }; | |
| if (ctx.frontmatter) { | |
| const data = filterSet(ctx.frontmatter, filterKeys, filterMode); | |
| if (ctx.frontmatter[skipKey]) { | |
| return; | |
| } | |
| // Nothing to render if all top-level are null and nulls should be | |
| // ignored. | |
| if (ignoreNulls && isEmpty(data)) { | |
| return; | |
| } | |
| if (Object.isEmpty(data)) { | |
| return; | |
| } | |
| createMetatable(target, data, context); | |
| } | |
| } | |
| }); | |
| } | |
| class MetatablePlugin extends obsidian.Plugin { | |
| onload() { | |
| return __awaiter(this, void 0, void 0, function* () { | |
| yield this.loadSettings(); | |
| this.registerMarkdownPostProcessor(frontmatterProcessor.bind(this)); | |
| this.addSettingTab(new MetatableSettingTab(this.app, this)); | |
| log('loaded'); | |
| }); | |
| } | |
| onunload() { | |
| log('unloaded'); | |
| } | |
| loadSettings() { | |
| return __awaiter(this, void 0, void 0, function* () { | |
| this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); | |
| }); | |
| } | |
| saveSettings() { | |
| return __awaiter(this, void 0, void 0, function* () { | |
| yield this.saveData(this.settings); | |
| }); | |
| } | |
| } | |
| module.exports = MetatablePlugin; | |
| //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9zZXR0aW5ncy50cyIsInNyYy9ydWxlLnRzIiwic3JjL3V0aWxzLnRzIiwic3JjL3RhYmxlLnRzIiwic3JjL21hcHBlcnMudHMiLCJzcmMvcGx1Z2luLnRzIl0sInNvdXJjZXNDb250ZW50IjpudWxsLCJuYW1lcyI6WyJQbHVnaW5TZXR0aW5nVGFiIiwiU2V0dGluZyIsImdldExpbmtwYXRoIiwiUGx1Z2luIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdURBO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUN0RyxRQUFRLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUN0SCxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RSxLQUFLLENBQUMsQ0FBQztBQUNQOztBQ2hETyxNQUFNLGdCQUFnQixHQUFzQjtJQUNqRCxhQUFhLEVBQUUsVUFBVTtJQUN6QixXQUFXLEVBQUUsS0FBSztJQUNsQixTQUFTLEVBQUUsRUFBRTtJQUNiLE9BQU8sRUFBRSxXQUFXO0lBQ3BCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsVUFBVSxFQUFFLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQztJQUN4QyxVQUFVLEVBQUUsUUFBUTtJQUNwQixTQUFTLEVBQUUsS0FBSztJQUNoQixLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUE7TUFJWSxtQkFBb0IsU0FBUUEseUJBQWdCO0lBR3ZELFlBQVksR0FBUSxFQUFFLE1BQXVCO1FBQzNDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7S0FDdEI7SUFFSyxPQUFPOztZQUNYLE1BQU0sRUFBQyxXQUFXLEVBQUUsTUFBTSxFQUFDLEdBQUcsSUFBSSxDQUFBO1lBRWxDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUVuQixXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBQyxDQUFDLENBQUE7WUFFeEQsSUFBSUMsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7aUJBQ3JCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztpQkFDMUIsT0FBTyxDQUFDLDBDQUEwQyxDQUFDO2lCQUNuRCxXQUFXLENBQUMsSUFBSSxJQUFJLElBQUk7aUJBQ1gsU0FBUyxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQztpQkFDdkMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDO2lCQUM3QyxTQUFTLENBQUMsZUFBZSxFQUFFLGNBQWMsQ0FBQztpQkFDMUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO2lCQUN2QyxRQUFRLENBQUMsQ0FBTyxLQUFLO2dCQUNwQixNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxLQUFhLENBQUE7Z0JBQzdDLE1BQU0sTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFBO2FBQzVCLENBQUEsQ0FBQyxDQUFDLENBQUE7WUFFbEIsSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7aUJBQ3JCLE9BQU8sQ0FBQyxVQUFVLENBQUM7aUJBQ25CLE9BQU8sQ0FBQyx3RUFBd0UsQ0FBQztpQkFDakYsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJO2lCQUNYLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztpQkFDakMsUUFBUSxDQUFDLENBQU8sS0FBSztnQkFDcEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO2dCQUMvQixNQUFNLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQTthQUM1QixDQUFBLENBQUMsQ0FBQyxDQUFBO1lBRWQsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtZQUUzQyxJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQztpQkFDckIsT0FBTyxDQUFDLG9CQUFvQixDQUFDO2lCQUM3QixPQUFPLENBQUMsc0NBQXNDLENBQUM7aUJBQy9DLFNBQVMsQ0FBQyxPQUFPLElBQUksT0FBTztpQkFDbkIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO2lCQUNyQyxRQUFRLENBQUMsQ0FBTyxLQUFLO2dCQUNwQixNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUE7Z0JBQ25DLE1BQU0sTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFBO2dCQUMzQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7YUFDZixDQUFBLENBQUMsQ0FBQyxDQUFBO1lBRWQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFO2dCQUNoQyxJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQztxQkFDckIsT0FBTyxDQUFDLFlBQVksQ0FBQztxQkFDckIsT0FBTyxDQUFDLDJEQUEyRCxDQUFDO3FCQUNwRSxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUk7cUJBQ1gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO3FCQUNuQyxRQUFRLENBQUMsQ0FBTyxLQUFLO29CQUNwQixNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUE7b0JBQ2pDLE1BQU0sTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFBO2lCQUM1QixDQUFBLENBQUMsQ0FBQyxDQUFBO2FBQ2Y7WUFHRCxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO1lBRTVDLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2lCQUNyQixPQUFPLENBQUMsYUFBYSxDQUFDO2lCQUN0QixPQUFPLENBQUMsdUNBQXVDLENBQUM7aUJBQ2hELFdBQVcsQ0FBQyxJQUFJLElBQUksSUFBSTtpQkFDWCxTQUFTLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztpQkFDN0IsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7aUJBQ3pCLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztpQkFDcEMsUUFBUSxDQUFDLENBQU8sS0FBSztnQkFDcEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsS0FBbUIsQ0FBQTtnQkFDaEQsTUFBTSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7YUFDNUIsQ0FBQSxDQUFDLENBQUMsQ0FBQTs7WUFHbEIsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQTtnQkFDeEQsTUFBTSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7YUFDNUI7WUFFRCxJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQztpQkFDckIsT0FBTyxDQUFDLGFBQWEsQ0FBQztpQkFDdEIsT0FBTyxDQUFDLHdHQUF3RyxDQUFDO2lCQUNqSCxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUk7aUJBQ1gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDL0MsUUFBUSxDQUFDLENBQU8sS0FBSztnQkFDcEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO2dCQUNoRSxNQUFNLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQTthQUM1QixDQUFBLENBQUMsQ0FBQyxDQUFBO1lBRWQsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFDLENBQUMsQ0FBQTtZQUVsRCxJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQztpQkFDckIsT0FBTyxDQUFDLFVBQVUsQ0FBQztpQkFDbkIsT0FBTyxDQUFDLDRHQUE0RyxDQUFDO2lCQUNySCxTQUFTLENBQUMsT0FBTyxJQUFJLE9BQU87aUJBQ2pCLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztpQkFDbkMsUUFBUSxDQUFDLENBQU8sS0FBSztnQkFDcEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO2dCQUNqQyxNQUFNLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQTthQUM1QixDQUFBLENBQUMsQ0FBQyxDQUFBO1NBQ2pCO0tBQUE7OztBQy9ISDs7Ozs7Ozs7Ozs7Ozs7TUFjYSxTQUFVLFNBQVEsR0FBYzs7O1NDbkM3QixZQUFZLENBQUMsS0FBYztJQUN6QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM3QixPQUFPLEtBQUssS0FBSyxJQUFJLENBQUE7S0FDdEI7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDOUMsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2Y7O0FDSEEsU0FBUyxNQUFNLENBQUMsT0FBb0I7SUFDbEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxNQUFNLENBQUE7SUFDbEUsT0FBTyxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtBQUM1RCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBWSxFQUFFLFFBQWlDLEVBQUUsVUFBMEU7SUFDL0ksTUFBTSxPQUFPLEdBQWdCLEtBQUssQ0FBQyxNQUFxQixDQUFBO0lBRXhELElBQUksT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFlBQVksQ0FBQyxlQUFlLENBQUMsRUFBRTtRQUMxQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNmLE9BQU87S0FDUjtJQUVELElBQUksT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNqQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUV6QyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDckMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtTQUNyQztRQUVELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMzQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsUUFBUSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQTtTQUN4QjtLQUNGO0FBQ0gsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQW9CO0lBQ3RDLE1BQU0sT0FBTyxHQUFnQixLQUFLLENBQUMsTUFBcUIsQ0FBQTtJQUV4RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxPQUFPLE1BQUssT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQSxFQUFFO1FBQzlGLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0tBQ2hCO0FBQ0gsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWE7O0lBQ2pDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUE7O0lBRXJDLE1BQUEsQ0FBQyxDQUFDLElBQUksMENBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBOztJQUVuQixNQUFBLENBQUMsQ0FBQyxJQUFJLDBDQUFFLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUM1QixDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNoQyxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNsQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUNqQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUM3QixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWYsT0FBTyxDQUFDLENBQUE7QUFDVixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsU0FBaUIsRUFBRSxRQUFnQjtJQUN0RCxPQUFPLHlCQUF5QixTQUFTLFNBQVMsU0FBUyxDQUFDQyxvQkFBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtBQUN0RixDQUFDO0FBR0QsU0FBUyxZQUFZLENBQUMsR0FBUTs7SUFDNUIsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNyQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUUxQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUE7SUFDdEIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7O0lBRzdCLE1BQUEsQ0FBQyxDQUFDLElBQUksMENBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBOztJQUVuQixNQUFBLENBQUMsQ0FBQyxJQUFJLDBDQUFFLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUM1QixDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNoQyxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNsQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUNqQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWYsT0FBTyxDQUFDLENBQUE7QUFDVixDQUFDO0FBRUQ7OztBQUdBLFNBQVMsUUFBUSxDQUFDLEtBQWEsRUFBRSxTQUFpQjtJQUNoRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3JDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQTtJQUV2RCxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUMxQixDQUFDO0FBRUQ7OztBQUdBLFNBQVMsZUFBZSxDQUFDLEtBQWEsRUFBRSxTQUFpQjtJQUN2RCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3JDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQTtJQUV2RCxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUMxQixDQUFDO0FBR0Q7OztBQUdBLFNBQVMsU0FBUyxDQUFDLEtBQWEsRUFBRSxTQUFpQjtJQUNqRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFFbEQsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDMUIsQ0FBQztBQU1ELFNBQVMsTUFBTSxDQUFDLElBQVksRUFBRSxLQUFhO0lBQ3pDLElBQUksSUFBSSxJQUFJLFVBQVUsRUFBRTtRQUN0QixPQUFPLElBQUksQ0FBQTtLQUNaOztJQUdELElBQUksSUFBSSxJQUFJLGdCQUFnQixJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7UUFDMUMsT0FBTyxJQUFJLENBQUE7S0FDWjs7SUFHRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxHQUFpQjtJQUN0QyxRQUFRLEdBQUcsWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxXQUFXLEVBQUM7QUFDNUQsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLEdBQWlCO0lBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBRXpELFFBQVEsR0FBRyxZQUFZLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLEVBQUM7QUFDNUYsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQWE7SUFDaEMsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQy9CLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxLQUFhO0lBQzNCLElBQUk7UUFDRixPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0tBQ3RCO0lBQUMsT0FBTSxDQUFDLEVBQUU7S0FFVjtBQUNILENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUFhO0lBQy9CLFFBQVEsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDO0FBQ3pELENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEtBQWE7SUFDdEMsUUFBUSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUM7QUFDdkQsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQVcsRUFBRSxPQUFnQjtJQUNoRCxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLE9BQU8sQ0FBQTtJQUN2QyxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsUUFBUSxDQUFBO0lBQzlCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUUxQyxJQUFJLFNBQVMsRUFBRTtRQUNiLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzFCLE9BQU8sUUFBUSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQTtTQUN2QztRQUVELElBQUksaUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDakMsT0FBTyxlQUFlLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1NBQzlDO1FBRUQsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDM0IsT0FBTyxTQUFTLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1NBQ3hDO0tBQ0Y7SUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7SUFFOUIsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDdEIsT0FBTyxZQUFZLENBQUMsR0FBVSxDQUFDLENBQUE7S0FDaEM7SUFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNkLE9BQU8sWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0tBQ2hDO0lBRUQsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUE7QUFDekIsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFDLEtBQWM7SUFDN0IsSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLEVBQUU7UUFDNUIsT0FBTyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQTtLQUN6QjtJQUVELE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQTtBQUN0QixDQUFDO0FBR0Q7OztBQUdBLFNBQVMsVUFBVSxDQUFDLEtBQWEsRUFBRSxJQUFtQixFQUFFLE9BQWdCOztJQUN0RSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLE9BQU8sQ0FBQTtJQUNuQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3pDLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDeEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMxQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzdCLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7VUFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1VBQ3ZCLFdBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7Ozs7SUFLOUIsTUFBQSxHQUFHLENBQUMsSUFBSSwwQ0FBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDcEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDeEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTs7SUFHakIsTUFBQSxLQUFLLENBQUMsSUFBSSwwQ0FBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDNUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVuQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFbEIsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQ7OztBQUdBLFNBQVMsVUFBVSxDQUFDLEtBQWEsRUFBRSxLQUFjLEVBQUUsT0FBZ0I7SUFDakUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLGtDQUFPLE9BQU8sS0FBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUcsQ0FBQTtJQUM1RSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUU1QixPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7O0FBR0EsU0FBUyxNQUFNLENBQUMsS0FBYSxFQUFFLEtBQWMsRUFBRSxPQUFnQjtJQUM3RCxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFBO0lBQzVCLE1BQU0sWUFBWSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUE7SUFFL0QsSUFBSSxPQUFPLFlBQVksSUFBSSxRQUFRLEVBQUU7UUFDbkMsT0FBTyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtLQUN6QztJQUVELE9BQU8sVUFBVSxDQUFDLEtBQUssRUFBRSxZQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQzNELENBQUM7QUFFRDs7O0FBR0EsU0FBUyxHQUFHLENBQUMsSUFBWSxFQUFFLE9BQWdCO0lBQ3pDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFBO0lBQ25DLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLFFBQVEsQ0FBQTtJQUN4RCxNQUFNLFlBQVksbUNBQVEsT0FBTyxLQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxHQUFFLENBQUE7SUFFckQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUV6QixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBb0I7UUFDN0QsSUFBSSxXQUFXLEtBQUssS0FBSyxJQUFJLElBQUksSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPO1FBRWxFLElBQUksVUFBVSxJQUFJLFFBQVEsRUFBRTtZQUMxQixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUM7Z0JBQUUsT0FBTztTQUNsRDtRQUVELElBQUksVUFBVSxJQUFJLE1BQU0sRUFBRTtZQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQztnQkFBRSxPQUFPO1NBQ25EO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFBO0tBQ2hELENBQUMsQ0FBQTtJQUVGLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUdEOzs7QUFHQSxTQUFTLElBQUksQ0FBQyxJQUFlLEVBQUUsT0FBZ0I7SUFDN0MsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUE7SUFDbkMsTUFBTSxZQUFZLG1DQUFRLE9BQU8sS0FBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsR0FBRSxDQUFBO0lBRXJELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQWE7UUFDekIsSUFBSSxLQUFLLENBQUE7UUFDVCxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXZDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2QixLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQTtTQUNqQzthQUFNLElBQUksT0FBTyxJQUFJLElBQUksUUFBUSxFQUFFO1lBQ2xDLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFHLFlBQVksQ0FBQyxDQUFBO1NBQ2pDO2FBQU07WUFDTCxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQVksRUFBRSxZQUFZLENBQUMsQ0FBQTtTQUNoRDtRQUVELEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtLQUNoQixDQUFDLENBQUE7SUFFRixPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFHRCxTQUFTLGFBQWEsQ0FBQyxJQUFhLEVBQUUsT0FBZ0I7SUFDcEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztVQUN0QixJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztVQUNuQixHQUFHLENBQUMsSUFBYyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ2xDLENBQUM7QUFFRDs7O0FBR0EsU0FBUyxPQUFPLENBQUMsS0FBYSxFQUFFLElBQVMsRUFBRSxPQUFnQjs7SUFDekQsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFBO0lBQzFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUE7SUFFekIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN6QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFMUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM3QixNQUFNLE9BQU8sR0FBRyxHQUFHLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQTtJQUNuQyxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1VBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztVQUN2QixhQUFhLENBQUMsSUFBSSxrQ0FBTyxPQUFPLEtBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLElBQUcsQ0FBQTs7SUFHekQsTUFBQSxHQUFHLENBQUMsSUFBSSwwQ0FBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDcEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDeEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBOztJQUdoQixNQUFBLEtBQUssQ0FBQyxJQUFJLDBDQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4QixLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM1QixLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNqQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFbEIsSUFBSSxJQUFJLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDdEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUU1QyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMzQixHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNsQyxHQUFHLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDOUQsR0FBRyxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDMUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFFakMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDOUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtLQUNyQjtJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUdELFNBQVMsTUFBTSxDQUFDLElBQVksRUFBRSxPQUFnQjtJQUM1QyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFBO0lBQzVCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDOUMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNqRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBRWhDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7S0FDOUI7SUFFRCxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVsQixPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7U0FFdUIsU0FBUyxDQUFDLElBQVksRUFBRSxPQUFnQjtJQUM5RCxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUE7SUFDbEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFBO0lBRXZDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxZQUFZLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFBO0lBQzVFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDNUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVyQixPQUFPLFFBQVEsQ0FBQTtBQUNqQjs7QUMzV0E7OztTQUdnQixPQUFPLENBQUMsSUFBZSxFQUFFLElBQVU7SUFDakQsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBOztJQUdoQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRWpDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7SUFFOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVk7UUFDeEIsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN2QyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFdkIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0tBQ2hCLENBQUMsQ0FBQTtJQUVGLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7QUFHQSxTQUFTLGFBQWEsQ0FBQyxJQUFlO0lBQ3BDLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtRQUFFLE9BQU8sRUFBRSxDQUFBO0tBQUU7SUFFL0IsSUFBSSxPQUFPLElBQUksSUFBSSxRQUFRLEVBQUU7UUFDM0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQTtLQUMxRTtJQUVELE9BQVEsSUFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDeEQsQ0FBQztBQUVELFNBQVMsR0FBRyxDQUFDLEtBQWE7O0lBQ3hCLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDckMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7Ozs7SUFLdEIsTUFBQSxDQUFDLENBQUMsSUFBSSwwQ0FBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7O0lBRWxCLE1BQUEsQ0FBQyxDQUFDLElBQUksMENBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBRTdCLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ2xDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ2pDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUVwQixPQUFPLENBQUMsQ0FBQTtBQUNWOzs7O0FDbEZBLFNBQVMsR0FBRyxDQUFDLEdBQVc7SUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDLENBQUE7QUFDbEMsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEVBQWUsRUFBRSxJQUFZLEVBQUUsT0FBZ0I7SUFDdEUsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNsQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0lBQzNDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUV0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUE7SUFDdkMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUM1QyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUN6QyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUNyQyxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsSUFBWTtJQUMzQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1NBQ3hCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7QUFDaEUsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLElBQVksRUFBRSxVQUFvQixFQUFFLFVBQXNCO0lBQzNFLE1BQU0sUUFBUSxHQUFHLFVBQVUsSUFBSSxRQUFRO1dBQ3BDLENBQUMsSUFBSSxDQUFDLENBQUM7V0FDUCxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDVixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztTQUNqQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUV0RSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDcEMsQ0FBQztBQUVELFNBQWUsb0JBQW9CLENBQXdCLEVBQWUsRUFBRSxHQUFpQzs7UUFDM0csTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFBO1FBQ25CLE1BQU0sV0FBVyxHQUFHLE1BQU0sRUFBRSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUUxRCxJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUU7WUFDeEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBZ0IsQ0FBQTtZQUN4RSxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBOztZQUUvQixNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQy9CLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTs7WUFHZCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNqSCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDL0UsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUE7WUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQTtZQUM3QixLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDaEIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsUUFBUSxFQUFFLEtBQUs7YUFDaEIsQ0FBQyxDQUFBO1lBRUYsTUFBTSxPQUFPLEdBQVk7Z0JBQ3ZCLFNBQVMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JDLEtBQUs7Z0JBQ0wsUUFBUTtnQkFDUixVQUFVO2dCQUNWLFFBQVEsRUFBRTtvQkFDUixJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhO29CQUNuQyxXQUFXO29CQUNYLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVM7b0JBQ3BDLFVBQVU7b0JBQ1YsVUFBVTtvQkFDVixTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTO2lCQUNyQztnQkFDRCxLQUFLLEVBQUUsQ0FBQzthQUNULENBQUE7WUFFRCxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUU7Z0JBQ25CLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQTtnQkFFL0QsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUFFLE9BQU07aUJBQUU7OztnQkFHeEMsSUFBSSxXQUFXLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUFFLE9BQU07aUJBQUU7Z0JBQzVDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFBRSxPQUFNO2lCQUFFO2dCQUVwQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTthQUN2QztTQUNGO0tBQ0Y7Q0FBQTtNQUVvQixlQUFnQixTQUFRQyxlQUFNO0lBRzNDLE1BQU07O1lBQ1YsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFMUIsSUFBSSxDQUFDLDZCQUE2QixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1lBQ25FLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFNUQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1NBQ2Q7S0FBQTtJQUVELFFBQVE7UUFDTixHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7S0FDaEI7SUFFSyxZQUFZOztZQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUU7S0FBQTtJQUVLLFlBQVk7O1lBQ2hCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDcEM7S0FBQTs7Ozs7In0= |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment