blob: d55485ac31f905ac0194ad69aeb62238cd1df3f7 [file] [log] [blame]
<!DOCTYPE html>
<!--[if IE]><![endif]-->
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Namespace Lucene.Net.Benchmarks.ByTask.Feeds
| Apache Lucene.NET 4.8.0-beta00013 Documentation </title>
<meta name="viewport" content="width=device-width">
<meta name="title" content="Namespace Lucene.Net.Benchmarks.ByTask.Feeds
| Apache Lucene.NET 4.8.0-beta00013 Documentation ">
<meta name="generator" content="docfx 2.56.2.0">
<link rel="shortcut icon" href="https://lucenenet.apache.org/docs/4.8.0-beta00009/logo/favicon.ico">
<link rel="stylesheet" href="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/docfx.vendor.css">
<link rel="stylesheet" href="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/docfx.css">
<link rel="stylesheet" href="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/main.css">
<meta property="docfx:navrel" content="toc.html">
<meta property="docfx:tocrel" content="benchmark/toc.html">
<meta property="docfx:rel" content="https://lucenenet.apache.org/docs/4.8.0-beta00009/">
</head>
<body data-spy="scroll" data-target="#affix" data-offset="120">
<span id="forkongithub"><a href="https://github.com/apache/lucenenet" target="_blank">Fork me on GitHub</a></span>
<div id="wrapper">
<header>
<nav id="autocollapse" class="navbar ng-scope" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">
<img id="logo" class="svg" src="https://lucenenet.apache.org/docs/4.8.0-beta00009/logo/lucene-net-color.png" alt="">
</a>
</div>
<div class="collapse navbar-collapse" id="navbar">
<form class="navbar-form navbar-right" role="search" id="search">
<div class="form-group">
<input type="text" class="form-control" id="search-query" placeholder="Search" autocomplete="off">
</div>
</form>
</div>
</div>
</nav>
<div class="subnav navbar navbar-default">
<div class="container hide-when-search">
<ul class="level0 breadcrumb">
<li>
<a href="https://lucenenet.apache.org/docs/4.8.0-beta00009/">API</a>
<span id="breadcrumb">
<ul class="breadcrumb">
<li></li>
</ul>
</span>
</li>
</ul>
</div>
</div>
</header>
<div class="container body-content">
<div id="search-results">
<div class="search-list"></div>
<div class="sr-items">
<p><i class="glyphicon glyphicon-refresh index-loading"></i></p>
</div>
<ul id="pagination"></ul>
</div>
</div>
<div role="main" class="container body-content hide-when-search">
<div class="sidenav hide-when-search">
<a class="btn toc-toggle collapse" data-toggle="collapse" href="#sidetoggle" aria-expanded="false" aria-controls="sidetoggle">Show / Hide Table of Contents</a>
<div class="sidetoggle collapse" id="sidetoggle">
<div id="sidetoc"></div>
</div>
</div>
<div class="article row grid-right">
<div class="col-md-10">
<article class="content wrap" id="_content" data-uid="Lucene.Net.Benchmarks.ByTask.Feeds">
<h1 id="Lucene_Net_Benchmarks_ByTask_Feeds" data-uid="Lucene.Net.Benchmarks.ByTask.Feeds" class="text-break">Namespace Lucene.Net.Benchmarks.ByTask.Feeds
</h1>
<div class="markdown level0 summary"><!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<p>Sources for benchmark inputs: documents and queries.</p>
</div>
<div class="markdown level0 conceptual"></div>
<div class="markdown level0 remarks"></div>
<h3 id="classes">Classes
</h3>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.AbstractQueryMaker.html">AbstractQueryMaker</a></h4>
<section><p>Abstract base query maker.
Each query maker should just implement the <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.AbstractQueryMaker.html#Lucene_Net_Benchmarks_ByTask_Feeds_AbstractQueryMaker_PrepareQueries">PrepareQueries()</a> method.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ContentItemsSource.html">ContentItemsSource</a></h4>
<section><p>Base class for source of data for benchmarking.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ContentSource.html">ContentSource</a></h4>
<section><p>Represents content from a specified source, such as TREC, Reuters etc. A
<a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ContentSource.html">ContentSource</a> is responsible for creating <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.DocData.html">DocData</a> objects for
its documents to be consumed by <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.DocMaker.html">DocMaker</a>. It also keeps track
of various statistics, such as how many documents were generated, size in
bytes etc.
<p>
For supported configuration parameters see <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ContentItemsSource.html">ContentItemsSource</a>.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.DemoHTMLParser.html">DemoHTMLParser</a></h4>
<section><p>Simple HTML Parser extracting title, meta tags, and body text
that is based on <a href="http://nekohtml.sourceforge.net/">NekoHTML</a>.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.DemoHTMLParser.Parser.html">DemoHTMLParser.Parser</a></h4>
<section><p>The actual parser to read HTML documents.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.DirContentSource.html">DirContentSource</a></h4>
<section><p>A <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ContentSource.html">ContentSource</a> using the Dir collection for its input. Supports
the following configuration parameters (on top of <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ContentSource.html">ContentSource</a>):
<ul><li>work.dirspecifies the working directory. Required if &quot;docs.dir&quot; denotes a relative path (<strong>default=work</strong>).</li><li>docs.dirspecifies the directory the Dir collection. Can be set to a relative path if &quot;work.dir&quot; is also specified (<strong>default=dir-out</strong>).</li></ul></p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.DirContentSource.Enumerator.html">DirContentSource.Enumerator</a></h4>
<section><p>Iterator over the files in the directory.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.DocData.html">DocData</a></h4>
<section><p>Output of parsing (e.g. HTML parsing) of an input document.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.DocMaker.html">DocMaker</a></h4>
<section><p>Creates <span class="xref">Lucene.Net.Documents.Document</span> objects. Uses a <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ContentSource.html">ContentSource</a> to generate
<a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.DocData.html">DocData</a> objects.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.DocMaker.DocState.html">DocMaker.DocState</a></h4>
<section><p>Document state, supports reuse of field instances
across documents (see <code>reuseFields</code> parameter).</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.EnwikiContentSource.html">EnwikiContentSource</a></h4>
<section><p>A <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ContentSource.html">ContentSource</a> which reads the English Wikipedia dump. You can read
the <code>.bz2</code> file directly (it will be decompressed on the fly). Config
properties:
<ul><li>keep.image.only.docsfalse|true (default <strong>true</strong>).</li><li>docs.file&lt;path to the file&gt;</li></ul></p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.EnwikiQueryMaker.html">EnwikiQueryMaker</a></h4>
<section><p>A QueryMaker that uses common and uncommon actual Wikipedia queries for
searching the English Wikipedia collection. 90 queries total.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.FacetSource.html">FacetSource</a></h4>
<section><p>Source items for facets.
<p>
For supported configuration parameters see <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ContentItemsSource.html">ContentItemsSource</a>.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.FileBasedQueryMaker.html">FileBasedQueryMaker</a></h4>
<section><p>Create queries from a <span class="xref">System.IO.FileStream</span>. One per line, pass them through the
QueryParser. Lines beginning with # are treated as comments.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.GeonamesLineParser.html">GeonamesLineParser</a></h4>
<section><p>A line parser for Geonames.org data.
See <a href="http://download.geonames.org/export/dump/readme.txt">&apos;geoname&apos; table</a>.
Requires <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SpatialDocMaker.html">SpatialDocMaker</a>.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.HeaderLineParser.html">HeaderLineParser</a></h4>
<section><p><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.LineParser.html">LineParser</a> which sets field names and order by
the header - any header - of the lines file.
It is less efficient than <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SimpleLineParser.html">SimpleLineParser</a> but more powerful.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.Int64ToEnglishContentSource.html">Int64ToEnglishContentSource</a></h4>
<section><p>Creates documents whose content is a <span class="xref">System.Int64</span> number starting from
<code><span class="xref">System.Int64.MinValue</span> + 10</code>.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.Int64ToEnglishQueryMaker.html">Int64ToEnglishQueryMaker</a></h4>
<section><p>Creates queries whose content is a spelled-out <span class="xref">System.Int64</span> number
starting from <code><span class="xref">System.Int64.MinValue</span> + 10</code>.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.LineDocSource.html">LineDocSource</a></h4>
<section><p>A <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ContentSource.html">ContentSource</a> reading one line at a time as a
<span class="xref">Lucene.Net.Documents.Document</span> from a single file. This saves IO
cost (over DirContentSource) of recursing through a directory and opening a
new file for every document.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.LineParser.html">LineParser</a></h4>
<section><p>Reader of a single input line into <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.DocData.html">DocData</a>.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.NoMoreDataException.html">NoMoreDataException</a></h4>
<section><p>Exception indicating there is no more data.
Thrown by Docs Makers if <code>doc.maker.forever</code> is <code>false</code> and docs sources of that maker where exhausted.
This is useful for iterating all document of a source, in case we don&apos;t know in advance how many docs there are.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.RandomFacetSource.html">RandomFacetSource</a></h4>
<section><p>Simple implementation of a random facet source.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ReutersContentSource.html">ReutersContentSource</a></h4>
<section><p>A <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ContentSource.html">ContentSource</a> reading from the Reuters collection.
<p>
Config properties:
<ul><li><strong>work.dir</strong>path to the root of docs and indexes dirs (default <strong>work</strong>).</li><li><strong>docs.dir</strong>path to the docs dir (default <strong>reuters-out</strong>).</li></ul></p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ReutersQueryMaker.html">ReutersQueryMaker</a></h4>
<section><p>A <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.IQueryMaker.html">IQueryMaker</a> that makes queries devised manually (by Grant Ingersoll) for
searching in the Reuters collection.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SimpleLineParser.html">SimpleLineParser</a></h4>
<section><p><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.LineParser.html">LineParser</a> which ignores the header passed to its constructor
and assumes simply that field names and their order are the same
as in <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Tasks.WriteLineDocTask.html#Lucene_Net_Benchmarks_ByTask_Tasks_WriteLineDocTask_DEFAULT_FIELDS">DEFAULT_FIELDS</a>. </p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SimpleQueryMaker.html">SimpleQueryMaker</a></h4>
<section><p>A <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.IQueryMaker.html">IQueryMaker</a> that makes queries for a collection created
using <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SingleDocSource.html">SingleDocSource</a>.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SimpleSloppyPhraseQueryMaker.html">SimpleSloppyPhraseQueryMaker</a></h4>
<section><p>Create sloppy phrase queries for performance test, in an index created using simple doc maker.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SingleDocSource.html">SingleDocSource</a></h4>
<section><p>Creates the same document each time <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SingleDocSource.html#Lucene_Net_Benchmarks_ByTask_Feeds_SingleDocSource_GetNextDocData_Lucene_Net_Benchmarks_ByTask_Feeds_DocData_">GetNextDocData(DocData)</a> is called.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SortableSingleDocSource.html">SortableSingleDocSource</a></h4>
<section><p>Adds fields appropriate for sorting: country, random_string and sort_field
(int). Supports the following parameters:
<ul><li><strong>sort.rng</strong>defines the range for sort-by-int field (default <strong>20000</strong>).</li><li><strong>rand.seed</strong>defines the seed to initialize Random with (default <strong>13</strong>).</li></ul></p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SpatialDocMaker.html">SpatialDocMaker</a></h4>
<section><p>Indexes spatial data according to a configured <span class="xref">Lucene.Net.Spatial.SpatialStrategy</span> with optional
shape transformation via a configured <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.IShapeConverter.html">IShapeConverter</a>. The converter can turn points into
circles and bounding boxes, in order to vary the type of indexing performance tests.
Unless it&apos;s subclass-ed to do otherwise, this class configures a <span class="xref">Spatial4n.Core.Context.SpatialContext</span>,
<span class="xref">Lucene.Net.Spatial.Prefix.Tree.SpatialPrefixTree</span>, and <span class="xref">Lucene.Net.Spatial.Prefix.RecursivePrefixTreeStrategy</span>. The Strategy is made
available to a query maker via the static method <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SpatialDocMaker.html#Lucene_Net_Benchmarks_ByTask_Feeds_SpatialDocMaker_GetSpatialStrategy_System_Int32_">GetSpatialStrategy(Int32)</a>.
See spatial.alg for a listing of spatial parameters, in particular those starting with &quot;spatial.&quot;
and &quot;doc.spatial&quot;.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SpatialFileQueryMaker.html">SpatialFileQueryMaker</a></h4>
<section><p>Reads spatial data from the body field docs from an internally created <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.LineDocSource.html">LineDocSource</a>.
It&apos;s parsed by <span class="xref">Spatial4n.Core.Context.SpatialContext.ReadShapeFromWkt(System.String)</span> and then
further manipulated via a configurable <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.IShapeConverter.html">IShapeConverter</a>. When using point
data, it&apos;s likely you&apos;ll want to configure the shape converter so that the query shapes actually
cover a region. The queries are all created &amp; cached in advance. This query maker works in
conjunction with <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SpatialDocMaker.html">SpatialDocMaker</a>. See spatial.alg for a listing of options, in
particular the options starting with &quot;query.&quot;.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.TrecContentSource.html">TrecContentSource</a></h4>
<section><p>Implements a <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.ContentSource.html">ContentSource</a> over the TREC collection.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.TrecDocParser.html">TrecDocParser</a></h4>
<section><p>Parser for trec doc content, invoked on doc text excluding &lt;DOC&gt; and &lt;DOCNO&gt;
which are handled in TrecContentSource. Required to be stateless and hence thread safe. </p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.TrecFBISParser.html">TrecFBISParser</a></h4>
<section><p>Parser for the FBIS docs in trec disks 4+5 collection format</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.TrecFR94Parser.html">TrecFR94Parser</a></h4>
<section><p>Parser for the FR94 docs in trec disks 4+5 collection format</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.TrecFTParser.html">TrecFTParser</a></h4>
<section><p>Parser for the FT docs in trec disks 4+5 collection format</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.TrecGov2Parser.html">TrecGov2Parser</a></h4>
<section><p>Parser for the GOV2 collection format</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.TrecLATimesParser.html">TrecLATimesParser</a></h4>
<section><p>Parser for the FT docs in trec disks 4+5 collection format</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.TrecParserByPath.html">TrecParserByPath</a></h4>
<section><p>Parser for trec docs which selects the parser to apply according
to the source files path, defaulting to <a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.TrecGov2Parser.html">TrecGov2Parser</a>.</p>
</section>
<h3 id="interfaces">Interfaces
</h3>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.IHTMLParser.html">IHTMLParser</a></h4>
<section><p>HTML Parsing Interface for test purposes.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.IQueryMaker.html">IQueryMaker</a></h4>
<section><p>Create queries for the test.</p>
</section>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.IShapeConverter.html">IShapeConverter</a></h4>
<section><p>Converts one shape to another. Created by
<a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.SpatialDocMaker.html#Lucene_Net_Benchmarks_ByTask_Feeds_SpatialDocMaker_MakeShapeConverter_Lucene_Net_Spatial_SpatialStrategy_Lucene_Net_Benchmarks_ByTask_Utils_Config_System_String_">MakeShapeConverter(SpatialStrategy, Config, String)</a>.</p>
</section>
<h3 id="enums">Enums
</h3>
<h4><a class="xref" href="Lucene.Net.Benchmarks.ByTask.Feeds.TrecDocParser.ParsePathType.html">TrecDocParser.ParsePathType</a></h4>
<section><p>Types of trec parse paths,</p>
</section>
</article>
</div>
<div class="hidden-sm col-md-2" role="complementary">
<div class="sideaffix">
<div class="contribution">
<ul class="nav">
<li>
<a href="https://github.com/apache/lucenenet/blob/docs/4.8.0-beta00013/src/Lucene.Net.Benchmark/ByTask/Feeds/package.md/#L2" class="contribution-link">Improve this Doc</a>
</li>
</ul>
</div>
<nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix" id="affix">
<!-- <p><a class="back-to-top" href="#top">Back to top</a><p> -->
</nav>
</div>
</div>
</div>
</div>
<footer>
<div class="grad-bottom"></div>
<div class="footer">
<div class="container">
<span class="pull-right">
<a href="#top">Back to top</a>
</span>
Copyright © 2020 The Apache Software Foundation, Licensed under the <a href='http://www.apache.org/licenses/LICENSE-2.0' target='_blank'>Apache License, Version 2.0</a><br> <small>Apache Lucene.Net, Lucene.Net, Apache, the Apache feather logo, and the Apache Lucene.Net project logo are trademarks of The Apache Software Foundation. <br>All other marks mentioned may be trademarks or registered trademarks of their respective owners.</small>
</div>
</div>
</footer>
</div>
<script type="text/javascript" src="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/docfx.vendor.js"></script>
<script type="text/javascript" src="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/docfx.js"></script>
<script type="text/javascript" src="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/main.js"></script>
</body>
</html>