✨ Send all files at start unless there is more files than the new argument limit
This commit is contained in:
+20
-15
@@ -71,19 +71,19 @@ class App
|
|||||||
})
|
})
|
||||||
.option('exclude', {
|
.option('exclude', {
|
||||||
alias: 'e',
|
alias: 'e',
|
||||||
describe: 'Files to exclude',
|
describe: 'Files to exclude (glob pattern)',
|
||||||
default:
|
default:
|
||||||
[
|
[
|
||||||
'**/.DS_Store',
|
'**/.DS_Store',
|
||||||
'node_modules/**',
|
'**/node_modules/**',
|
||||||
'vendor/**',
|
'**/vendor/**',
|
||||||
'.git',
|
'**/.git',
|
||||||
'.vscode',
|
'**/.vscode',
|
||||||
'.env',
|
'**/.env',
|
||||||
'.log',
|
'**/.log',
|
||||||
'.idea/**',
|
'.idea/**',
|
||||||
'*___jb_old___',
|
'**/*___jb_old___',
|
||||||
'*___jb_tmp___'
|
'**/*___jb_tmp___'
|
||||||
],
|
],
|
||||||
type: 'array'
|
type: 'array'
|
||||||
})
|
})
|
||||||
@@ -99,11 +99,11 @@ class App
|
|||||||
default: false,
|
default: false,
|
||||||
type: 'boolean'
|
type: 'boolean'
|
||||||
})
|
})
|
||||||
.option('initial-send', {
|
.option('limit', {
|
||||||
alias: 'i',
|
alias: 'l',
|
||||||
describe: 'Send files in folder at start',
|
describe: 'Limit of files above which nothing will be sent at start',
|
||||||
default: false,
|
default: 99,
|
||||||
type: 'boolean'
|
type: 'number'
|
||||||
})
|
})
|
||||||
.option('max-file-size', {
|
.option('max-file-size', {
|
||||||
alias: 'm',
|
alias: 'm',
|
||||||
@@ -131,11 +131,16 @@ class App
|
|||||||
config.exclude = args.exclude
|
config.exclude = args.exclude
|
||||||
config.open = args.open
|
config.open = args.open
|
||||||
config.test = args.test
|
config.test = args.test
|
||||||
config.initialSend = args['initial-send']
|
config.limit = args.limit
|
||||||
config.maxFileSize = args['max-file-size']
|
config.maxFileSize = args['max-file-size']
|
||||||
config.server = args.server
|
config.server = args.server
|
||||||
config.host = args.host
|
config.host = args.host
|
||||||
|
|
||||||
|
if(config.limit === -1)
|
||||||
|
{
|
||||||
|
config.limit = Infinity
|
||||||
|
}
|
||||||
|
|
||||||
if(config.name === '')
|
if(config.name === '')
|
||||||
{
|
{
|
||||||
if(args._.length > 0 && typeof args._[0] === 'string' && args._[0] !== '')
|
if(args._.length > 0 && typeof args._[0] === 'string' && args._[0] !== '')
|
||||||
|
|||||||
+6
-5
@@ -3,7 +3,7 @@ const slug = require('slug')
|
|||||||
const Files = require('./files.js')
|
const Files = require('./files.js')
|
||||||
const Chat = require('./chat.js')
|
const Chat = require('./chat.js')
|
||||||
const JSZip = require('jszip')
|
const JSZip = require('jszip')
|
||||||
const glob = require('glob')
|
const globby = require('globby')
|
||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const chalk = require('chalk')
|
const chalk = require('chalk')
|
||||||
@@ -15,11 +15,11 @@ class Project
|
|||||||
this.config = _config
|
this.config = _config
|
||||||
this.path = _options.path
|
this.path = _options.path
|
||||||
this.watcherSocket = _options.watcherSocket
|
this.watcherSocket = _options.watcherSocket
|
||||||
|
this.exclude = _options.exclude
|
||||||
|
|
||||||
this.setName(_options.name)
|
this.setName(_options.name)
|
||||||
this.setSocket()
|
this.setSocket()
|
||||||
|
|
||||||
this.excludeRegex = new RegExp(_options.excludeRegex)
|
|
||||||
this.zipNeedsUpdate = true
|
this.zipNeedsUpdate = true
|
||||||
this.files = new Files(this.config, { projectSocket: this.projectSocket })
|
this.files = new Files(this.config, { projectSocket: this.projectSocket })
|
||||||
this.chat = new Chat(this.config, { slug: this.slug, watcherSocket: this.watcherSocket })
|
this.chat = new Chat(this.config, { slug: this.slug, watcherSocket: this.watcherSocket })
|
||||||
@@ -71,9 +71,10 @@ class Project
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Search files with glob
|
// Search files with glob
|
||||||
const files = glob.sync(this.path + '/**', { dot: true })
|
const globPattern = ['**', ...this.exclude.map((item) => `!${item}`)]
|
||||||
|
const files = globby.sync(globPattern, { dot: true })
|
||||||
|
|
||||||
// // Create a zip file
|
// Create a zip file
|
||||||
const zip = new JSZip()
|
const zip = new JSZip()
|
||||||
|
|
||||||
// Add files to zip
|
// Add files to zip
|
||||||
@@ -82,7 +83,7 @@ class Project
|
|||||||
const stats = fs.lstatSync(_file)
|
const stats = fs.lstatSync(_file)
|
||||||
|
|
||||||
// Ignore if folder or exluded
|
// Ignore if folder or exluded
|
||||||
if(stats.isFile() && !_file.match(this.excludeRegex))
|
if(stats.isFile())
|
||||||
{
|
{
|
||||||
const basename = path.basename(_file)
|
const basename = path.basename(_file)
|
||||||
const relativePath = _file.replace(basename, '').replace(this.path, '')
|
const relativePath = _file.replace(basename, '').replace(this.path, '')
|
||||||
|
|||||||
+39
-24
@@ -7,6 +7,7 @@ const opener = require('opener')
|
|||||||
const nodeNotifier = require('node-notifier')
|
const nodeNotifier = require('node-notifier')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const chalk = require('chalk')
|
const chalk = require('chalk')
|
||||||
|
const globby = require('globby')
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Watcher class
|
* Watcher class
|
||||||
@@ -26,6 +27,32 @@ class Watcher
|
|||||||
this.watch()
|
this.watch()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set exclude regex
|
||||||
|
* Because chakodar doesn't support dot files with glob pattern
|
||||||
|
*/
|
||||||
|
setExcludeRegex()
|
||||||
|
{
|
||||||
|
// Exclude files regex
|
||||||
|
const regexs = []
|
||||||
|
const Minimatch = require('minimatch').Minimatch
|
||||||
|
|
||||||
|
for(const _excludeKey in this.config.exclude)
|
||||||
|
{
|
||||||
|
const _exclude = this.config.exclude[_excludeKey]
|
||||||
|
const minimatch = new Minimatch(_exclude, { dot: true })
|
||||||
|
|
||||||
|
let regex = '' + minimatch.makeRe()
|
||||||
|
|
||||||
|
regex = regex.replace('/^', '')
|
||||||
|
regex = regex.replace('$/', '')
|
||||||
|
|
||||||
|
regexs.push(regex)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.excludeRegex = new RegExp(regexs.join('|'))
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set socket
|
* Set socket
|
||||||
*/
|
*/
|
||||||
@@ -45,7 +72,7 @@ class Watcher
|
|||||||
name = path.parse(this.path).name
|
name = path.parse(this.path).name
|
||||||
}
|
}
|
||||||
|
|
||||||
this.socket.emit('start_project', { name, path: this.path, excludeRegex: '' + this.excludeRegex })
|
this.socket.emit('start_project', { name, path: this.path, exclude: this.config.exclude })
|
||||||
|
|
||||||
// Debug
|
// Debug
|
||||||
if(this.config.debug)
|
if(this.config.debug)
|
||||||
@@ -88,41 +115,29 @@ class Watcher
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
setExcludeRegex()
|
|
||||||
{
|
|
||||||
// Exclude files regex
|
|
||||||
const regexs = []
|
|
||||||
const Minimatch = require('minimatch').Minimatch
|
|
||||||
|
|
||||||
for(const _excludeKey in this.config.exclude)
|
|
||||||
{
|
|
||||||
const _exclude = this.config.exclude[_excludeKey]
|
|
||||||
const minimatch = new Minimatch(_exclude, { dot: true })
|
|
||||||
|
|
||||||
let regex = '' + minimatch.makeRe()
|
|
||||||
|
|
||||||
regex = regex.replace('/^', '')
|
|
||||||
regex = regex.replace('$/', '')
|
|
||||||
|
|
||||||
regexs.push(regex)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.excludeRegex = new RegExp(regexs.join('|'))
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Watch
|
* Watch
|
||||||
* Listen to modifications on files and folders
|
* Listen to modifications on files and folders
|
||||||
*/
|
*/
|
||||||
watch()
|
watch()
|
||||||
{
|
{
|
||||||
|
const globPattern = ['**', ...this.config.exclude.map((item) => `!${item}`)]
|
||||||
|
const files = globby.sync(globPattern, { dot: true })
|
||||||
|
const ignoreInitial = files.length > this.config.limit
|
||||||
|
|
||||||
|
if(ignoreInitial)
|
||||||
|
{
|
||||||
|
console.log(`${chalk.green.bold('watcher')} - ${chalk.cyan('start wating')} - ${chalk.red(`File limit exceeded (${this.config.limit})`)}`)
|
||||||
|
}
|
||||||
|
|
||||||
// Set up
|
// Set up
|
||||||
this.watcher = chokidar.watch(
|
this.watcher = chokidar.watch(
|
||||||
this.path,
|
this.path,
|
||||||
{
|
{
|
||||||
// ignored: /[\/\\]\./,
|
// ignored: /[\/\\]\./,
|
||||||
ignored: this.excludeRegex,
|
ignored: this.excludeRegex,
|
||||||
ignoreInitial: !this.config.initialSend
|
ignoreInitial: ignoreInitial,
|
||||||
|
ignorePermissionErrors: true
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Generated
+1404
-51
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -36,10 +36,10 @@
|
|||||||
"homepage": "https://github.com/brunosimon/keppler",
|
"homepage": "https://github.com/brunosimon/keppler",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chalk": "^2.3.0",
|
"chalk": "^2.3.0",
|
||||||
"chokidar": "^1.7.0",
|
"chokidar": "^2.0.0",
|
||||||
"diff": "^3.3.0",
|
"diff": "^3.3.0",
|
||||||
"express": "^4.15.3",
|
"express": "^4.15.3",
|
||||||
"glob": "^7.1.2",
|
"globby": "^7.1.1",
|
||||||
"gradient-string": "^1.0.0",
|
"gradient-string": "^1.0.0",
|
||||||
"helmet": "^3.8.1",
|
"helmet": "^3.8.1",
|
||||||
"html-entities": "^1.2.1",
|
"html-entities": "^1.2.1",
|
||||||
|
|||||||
@@ -30,14 +30,14 @@ npm install -g keppler
|
|||||||
#### 2 - Launch Keppler inside your project folder
|
#### 2 - Launch Keppler inside your project folder
|
||||||
|
|
||||||
In your console, navigate to your project folder.
|
In your console, navigate to your project folder.
|
||||||
Then launch Keppler with the name of your choice:
|
Then launch Keppler:
|
||||||
|
|
||||||
```
|
```
|
||||||
cd ./my-awesome-project
|
cd ./my-awesome-project
|
||||||
keppler "My awesome project"
|
keppler
|
||||||
```
|
```
|
||||||
|
|
||||||
Keppler should open in your default browser and start watching any changes you make on the files inside the folder.
|
Keppler should open in your default browser and start watching any changes you make inside the folder.
|
||||||
|
|
||||||
#### 3 - Share the URL with your audience
|
#### 3 - Share the URL with your audience
|
||||||
|
|
||||||
@@ -49,13 +49,19 @@ By default, you must be on the same network.
|
|||||||
You can add configuration arguments when calling Keppler.
|
You can add configuration arguments when calling Keppler.
|
||||||
|
|
||||||
```
|
```
|
||||||
keppler "My project" --debug 0 --port 1234 --exclude "node_modules/**" --open true --test true --initial-send true --max-file-size 99999
|
keppler "My project" --debug 0 --port 1234 --exclude "node_modules/**" --open true --test true --limit 200 --max-file-size 99999
|
||||||
```
|
```
|
||||||
|
|
||||||
And you can use shortcuts for those arguments
|
And you can use shortcuts for those same arguments.
|
||||||
|
|
||||||
```
|
```
|
||||||
keppler "My project" -d 0 -p 1234 -e "node_modules/**" -oti -m 99999
|
keppler "My project" -d 0 -p 1234 -e "node_modules/**" -oti -l 200 -m 99999
|
||||||
|
```
|
||||||
|
|
||||||
|
All those arguments are optional. You can simply run Keppler.
|
||||||
|
|
||||||
|
```
|
||||||
|
keppler
|
||||||
```
|
```
|
||||||
|
|
||||||
Arguments list
|
Arguments list
|
||||||
@@ -78,8 +84,8 @@ Arguments list
|
|||||||
|---|---|
|
|---|---|
|
||||||
|parameter|`--exclude`|
|
|parameter|`--exclude`|
|
||||||
|shortcut|`-e`|
|
|shortcut|`-e`|
|
||||||
|default value|*(string)*`**/.DS_Store,node_modules/**,vendor/**,.git,.vscode,.env,.log,.idea/**,*___jb_old___,*___jb_tmp___`|
|
|default value|*(string)*`**/.DS_Store,**/node_modules/**,**/vendor/**,**/.git,**/.vscode,**/.env,**/.log,.idea/**,**/*___jb_old___,**/*___jb_tmp___`|
|
||||||
|description|List of paths to exclude (comma seperated and wildcards support)|
|
|description|List of paths to exclude (glob pattern with comma seperation)|
|
||||||
|
|
||||||
|||
|
|||
|
||||||
|---|---|
|
|---|---|
|
||||||
@@ -97,10 +103,10 @@ Arguments list
|
|||||||
|
|
||||||
|||
|
|||
|
||||||
|---|---|
|
|---|---|
|
||||||
|parameter|`--initial-send`|
|
|parameter|`--limit`|
|
||||||
|shortcut|`-i`|
|
|shortcut|`-l`|
|
||||||
|default value|*(bool)*`false`|
|
|default value|*(number)*`99`|
|
||||||
|description|Send current files in the folder<br>:warning: Too much files may cause issues|
|
|description|Limit of files above which nothing will be sent at start<br>:warning: Too much files may cause issues|
|
||||||
|
|
||||||
|||
|
|||
|
||||||
|---|---|
|
|---|---|
|
||||||
@@ -132,7 +138,7 @@ Arguments list
|
|||||||
|
|
||||||
## Online instance
|
## Online instance
|
||||||
|
|
||||||
You can run Keppler online. Anybody would be able to connect to it and your audience won't need to be on the same network as you.
|
You can run Keppler online. Anyone with access to the server will be able to see the projects without having to be on the same network as you.
|
||||||
|
|
||||||
Keppler doesn't provide any host solution. You'll have to use your own server.
|
Keppler doesn't provide any host solution. You'll have to use your own server.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
a
|
||||||
Generated
+2
-3
@@ -134,16 +134,15 @@
|
|||||||
<option name="number" value="Default" />
|
<option name="number" value="Default" />
|
||||||
<option name="presentableId" value="Default" />
|
<option name="presentableId" value="Default" />
|
||||||
<updated>1515534909890</updated>
|
<updated>1515534909890</updated>
|
||||||
<workItem from="1515534912205" duration="739000" />
|
<workItem from="1515534912205" duration="1588000" />
|
||||||
</task>
|
</task>
|
||||||
<servers />
|
<servers />
|
||||||
</component>
|
</component>
|
||||||
<component name="TimeTrackingManager">
|
<component name="TimeTrackingManager">
|
||||||
<option name="totallyTimeSpent" value="739000" />
|
<option name="totallyTimeSpent" value="1588000" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ToolWindowManager">
|
<component name="ToolWindowManager">
|
||||||
<frame x="443" y="43" width="977" height="795" extended-state="0" />
|
<frame x="443" y="43" width="977" height="795" extended-state="0" />
|
||||||
<editor active="true" />
|
|
||||||
<layout>
|
<layout>
|
||||||
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.3582395" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
|
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.3582395" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
|
||||||
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
|
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
test
|
||||||
@@ -16,6 +16,337 @@
|
|||||||
<a href="#">Contact</a>
|
<a href="#">Contact</a>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user