From bbd5037c8d46f4543b96a47ed677752e5172b471 Mon Sep 17 00:00:00 2001 From: Joseph Scheuhammer Date: Tue, 1 Aug 2017 16:34:18 -0400 Subject: [PATCH 1/5] GPII-1939: Device Reporter includes screen resolution information - modified the Platform Reporter to be context aware. - modified the Platform Reporter to allow OS contexts to report additional specific information, e.g., screen resolutions. --- .../deviceReporter/src/DeviceReporter.js | 48 +++++++-- .../test/PlatformReporterTests.js | 99 +++++++++++++++++++ .../deviceReporter/test/all-tests.js | 27 +++++ tests/all-tests.js | 3 +- 4 files changed, 169 insertions(+), 8 deletions(-) create mode 100644 gpii/node_modules/deviceReporter/test/PlatformReporterTests.js create mode 100644 gpii/node_modules/deviceReporter/test/all-tests.js diff --git a/gpii/node_modules/deviceReporter/src/DeviceReporter.js b/gpii/node_modules/deviceReporter/src/DeviceReporter.js index a6213ecc9..ff8c8a6ad 100644 --- a/gpii/node_modules/deviceReporter/src/DeviceReporter.js +++ b/gpii/node_modules/deviceReporter/src/DeviceReporter.js @@ -40,7 +40,7 @@ fluid.defaults("gpii.deviceReporter.base", { }, components: { platformReporter: { - type: "gpii.platformReporter.native" + type: "gpii.platformReporter" }, nameResolver: { type: "gpii.deviceReporter.nameResolver" @@ -162,21 +162,55 @@ gpii.deviceReporter.filterByInstalledSolutions = function (entries, deviceReport return installedSolutions; }; -fluid.defaults("gpii.platformReporter.native", { - gradeNames: ["fluid.component"], +fluid.defaults("gpii.platformReporter", { + gradeNames: ["fluid.component", "fluid.contextAware"], + contextAwareness: { + platform: { + checks: { + linux: { + contextValue: "{gpii.contexts.linux}", + gradeNames: "gpii.platformReporter.linux" + }, + windows: { + contextValue: "{gpii.contexts.windows}", + gradeNames: "gpii.platformReporter.windows" + } + } + } + }, invokers: { + getBasicOS: "gpii.platformReporter.getBasicOS", reportPlatform: { - funcName: "gpii.platformReporter.native.reportPlatform" - } + funcName: "gpii.platformReporter.reportAll", + args: ["{that}", "{that}.reportOSinfo"] + }, + reportOSinfo: "fluid.identity" } }); -gpii.platformReporter["native"].reportPlatform = function () { // "native" is a reserved word +/** + * Returns the OS name and its version. + * + * @return (Object) An object consisting of "id" and "version" properties. + */ +gpii.platformReporter.getBasicOS = function () { return { - // TODO: need to report more details - windowmanager, etc. id: os.platform(), // TODO: Need a better strategy - Node semver fails horribly // in the face of the benign underscore (eg. x86_64). version: os.release().replace("_", "-") }; }; + +/** + * Returns platform information such as OS, OS version, screen resolution + * and so on. + * + * @param that (Component) A platform reporter instance. + * @param reportOSinfo {Function} The context specific function to call to + * cquire OS specific platform information. + */ +gpii.platformReporter.reportAll = function (that, reportOSinfo) { + var allInfo = that.getBasicOS(); + return Object.assign(allInfo, reportOSinfo()); +}; diff --git a/gpii/node_modules/deviceReporter/test/PlatformReporterTests.js b/gpii/node_modules/deviceReporter/test/PlatformReporterTests.js new file mode 100644 index 000000000..48985095f --- /dev/null +++ b/gpii/node_modules/deviceReporter/test/PlatformReporterTests.js @@ -0,0 +1,99 @@ +/* + * GPII Web-based PlatformReporter unit tests/ + * + * Copyright 2017 Inclusive Design Research Centre, OCAD University + * + * Licensed under the New BSD license. You may not use this file except in + * compliance with this License. You may obtain a copy of the License at + * https://github.com/gpii/universal/LICENSE.txt + */ + +/* global require */ + +"use strict"; + +var fluid = require("infusion"), + jqUnit = fluid.require("node-jqunit"); + +require("../index.js"); + +var gpii = fluid.registerNamespace("gpii"); +fluid.registerNamespace("gpii.tests.platformReporter"); + +fluid.defaults("gpii.tests.platformReporter", { + gradeNames: ["gpii.platformReporter", "gpii.contexts.test"], + invokers: { + reportOSinfo: "gpii.tests.platformReporter.reportOSinfo" + } +}); + +// Mock OS info, e.g., screen resolutions. +gpii.tests.platformReporter.OSinfo = fluid.freezeRecursive({ + "screen-resolution": { width: 640, height: 480 }, + "available-resolutions": [ + { width: 640, height: 480 }, + { width: 1440, height: 900 }, + { width: 1680, height: 1050 } + ] +}); + +/** + * Return a mock of screen resolutions. + * + * @return {Object} Current and available screen resolutions. + */ +gpii.tests.platformReporter.reportOSinfo = function () { + return gpii.tests.platformReporter.OSinfo; +}; + +var platformReporter = gpii.tests.platformReporter(); + +jqUnit.module("Platform Reporter"); +jqUnit.test( + "Test getBasicOS()", + function () { + var basicOS = platformReporter.getBasicOS(); + jqUnit.assertDeepEq( + "Basic OS informaiton", 2, Object.keys(basicOS).length + ); + jqUnit.assertNotNull("ID property", basicOS.id); + jqUnit.assertNotNull("Version property", basicOS.version); + } +); +jqUnit.test( + "Test reportOSinfo()", + function () { + var OSinfo = platformReporter.reportOSinfo(); + jqUnit.assertDeepEq( + "Platform OS informaiton", + gpii.tests.platformReporter.OSinfo, + OSinfo + ); + } +); +jqUnit.test( + "Test reportPlatform()", + function () { + var platform = platformReporter.reportPlatform(); + jqUnit.assertEquals( + "OS ID", + platformReporter.getBasicOS().id, + platform.id + ); + jqUnit.assertEquals( + "OS Version", + platformReporter.getBasicOS().version, + platform.version + ); + jqUnit.assertDeepEq( + "Screen resolution", + gpii.tests.platformReporter.OSinfo["screen-resolution"], + platform["screen-resolution"] + ); + jqUnit.assertDeepEq( + "Available resolutions", + gpii.tests.platformReporter.OSinfo["available-resolutions"], + platform["available-resolutions"] + ); + } +); diff --git a/gpii/node_modules/deviceReporter/test/all-tests.js b/gpii/node_modules/deviceReporter/test/all-tests.js new file mode 100644 index 000000000..77ab0c5b0 --- /dev/null +++ b/gpii/node_modules/deviceReporter/test/all-tests.js @@ -0,0 +1,27 @@ +/** + * GPII Device Reporter Tests + * + * Copyright 2017 Inclusive Design Research Centre, OCAD University + * + * Licensed under the New BSD license. You may not use this file except in + * compliance with this License. + * + * You may obtain a copy of the License at + * https://github.com/gpii/universal/LICENSE.txt + */ +"use strict"; + +var fluid = require("infusion"), + kettle = fluid.require("kettle"); + +kettle.loadTestingSupport(); + +var testIncludes = [ + "./PlatformReporterTests.js" +]; + +var tests = []; + +fluid.each(testIncludes, function (path) { + tests = tests.concat(fluid.require(path, require)); +}); diff --git a/tests/all-tests.js b/tests/all-tests.js index d284ca49d..1744e1c85 100644 --- a/tests/all-tests.js +++ b/tests/all-tests.js @@ -69,7 +69,8 @@ var testIncludes = [ "../gpii/node_modules/rawPreferencesServer/test/RawPreferencesTest.js", "../gpii/node_modules/ontologyHandler/test/node/OntologyHandlerTests.js", "../gpii/node_modules/contextManager/test/ContextManagerTests.js", - "../gpii/node_modules/singleInstance/test/SingleInstanceTests.js" + "../gpii/node_modules/singleInstance/test/SingleInstanceTests.js", + "../gpii/node_modules/deviceReporter/test/all-tests.js", ]; fluid.each(testIncludes, function (path) { From 80264424669aef031824f42e1315110b7ead44e0 Mon Sep 17 00:00:00 2001 From: Joseph Scheuhammer Date: Wed, 2 Aug 2017 09:36:04 -0400 Subject: [PATCH 2/5] GPII-1939: Device Reporter reports additional OS specific information Renmaed the function for getting the OS specific information and fixed spelling. --- .../deviceReporter/src/DeviceReporter.js | 12 ++++++------ .../deviceReporter/test/PlatformReporterTests.js | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/gpii/node_modules/deviceReporter/src/DeviceReporter.js b/gpii/node_modules/deviceReporter/src/DeviceReporter.js index ff8c8a6ad..fb681bbcd 100644 --- a/gpii/node_modules/deviceReporter/src/DeviceReporter.js +++ b/gpii/node_modules/deviceReporter/src/DeviceReporter.js @@ -182,9 +182,9 @@ fluid.defaults("gpii.platformReporter", { getBasicOS: "gpii.platformReporter.getBasicOS", reportPlatform: { funcName: "gpii.platformReporter.reportAll", - args: ["{that}", "{that}.reportOSinfo"] + args: ["{that}", "{that}.getOSspecifics"] }, - reportOSinfo: "fluid.identity" + getOSspecifics: "fluid.identity" } }); @@ -207,10 +207,10 @@ gpii.platformReporter.getBasicOS = function () { * and so on. * * @param that (Component) A platform reporter instance. - * @param reportOSinfo {Function} The context specific function to call to - * cquire OS specific platform information. + * @param getOSspecifics {Function} The context specific function to call to + * acquire OS specific platform information. */ -gpii.platformReporter.reportAll = function (that, reportOSinfo) { +gpii.platformReporter.reportAll = function (that, getOSspecifics) { var allInfo = that.getBasicOS(); - return Object.assign(allInfo, reportOSinfo()); + return Object.assign(allInfo, getOSspecifics()); }; diff --git a/gpii/node_modules/deviceReporter/test/PlatformReporterTests.js b/gpii/node_modules/deviceReporter/test/PlatformReporterTests.js index 48985095f..ffa5dfb1c 100644 --- a/gpii/node_modules/deviceReporter/test/PlatformReporterTests.js +++ b/gpii/node_modules/deviceReporter/test/PlatformReporterTests.js @@ -23,7 +23,7 @@ fluid.registerNamespace("gpii.tests.platformReporter"); fluid.defaults("gpii.tests.platformReporter", { gradeNames: ["gpii.platformReporter", "gpii.contexts.test"], invokers: { - reportOSinfo: "gpii.tests.platformReporter.reportOSinfo" + getOSspecifics: "gpii.tests.platformReporter.getOSspecifics" } }); @@ -42,7 +42,7 @@ gpii.tests.platformReporter.OSinfo = fluid.freezeRecursive({ * * @return {Object} Current and available screen resolutions. */ -gpii.tests.platformReporter.reportOSinfo = function () { +gpii.tests.platformReporter.getOSspecifics = function () { return gpii.tests.platformReporter.OSinfo; }; @@ -61,9 +61,9 @@ jqUnit.test( } ); jqUnit.test( - "Test reportOSinfo()", + "Test getOSspecifics()", function () { - var OSinfo = platformReporter.reportOSinfo(); + var OSinfo = platformReporter.getOSspecifics(); jqUnit.assertDeepEq( "Platform OS informaiton", gpii.tests.platformReporter.OSinfo, From 569642d31ea2eb4c285d09c5243b85cd0466ffb3 Mon Sep 17 00:00:00 2001 From: Joseph Scheuhammer Date: Mon, 21 Aug 2017 14:15:19 -0400 Subject: [PATCH 3/5] GPII-1939: Fixed lint error. --- tests/all-tests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/all-tests.js b/tests/all-tests.js index 1744e1c85..8880106d1 100644 --- a/tests/all-tests.js +++ b/tests/all-tests.js @@ -70,7 +70,7 @@ var testIncludes = [ "../gpii/node_modules/ontologyHandler/test/node/OntologyHandlerTests.js", "../gpii/node_modules/contextManager/test/ContextManagerTests.js", "../gpii/node_modules/singleInstance/test/SingleInstanceTests.js", - "../gpii/node_modules/deviceReporter/test/all-tests.js", + "../gpii/node_modules/deviceReporter/test/all-tests.js" ]; fluid.each(testIncludes, function (path) { From fcdec05dd7f56e5e340a8d9a648c6d9a6c8314c0 Mon Sep 17 00:00:00 2001 From: Joseph Scheuhammer Date: Mon, 11 Sep 2017 10:10:19 -0400 Subject: [PATCH 4/5] GPII-1939: Simplified context aware features Also, merged upstream GPII master branch into GPII-1939. --- documentation/BrowserChannel.md | 4 +- documentation/RawPreferencesServer.md | 2 +- documentation/SolutionsRegistryFormat.md | 12 +- documentation/Transformer.md | 2 +- documentation/loginAndLogoutFlow.md | 38 +- .../browserChannelClient.js | 2 +- .../contextManager/src/ContextManager.js | 4 +- .../deviceReporter/src/DeviceReporter.js | 15 +- .../test/PlatformReporterTests.js | 24 +- gpii/node_modules/eventLog/README.md | 13 + gpii/node_modules/eventLog/index.js | 26 + gpii/node_modules/eventLog/package.json | 13 + gpii/node_modules/eventLog/src/eventLog.js | 267 ++++++++++ gpii/node_modules/eventLog/src/installID.js | 98 ++++ .../eventLog/test/EventLogTests.js | 387 +++++++++++++++ .../configs/gpii.flowManager.config.base.json | 5 + .../flowManager/src/FlowManager.js | 7 + .../test/data/matchmaker.output.payload.json | 4 +- .../html/OKCancelDialog-test.html | 2 + .../components/login/html/Login-test.html | 2 + .../html/PrivacySettings-test.html | 2 + .../test/html/OAuth2UtilitiesTests.html | 2 + .../lifecycleManager/src/LifecycleManager.js | 6 +- .../test/js/LifecycleManagerTests.js | 10 +- .../inverseCapabilities/os_win7_expected.json | 2 +- .../test/preferencesServerTests.js | 10 +- gpii/node_modules/processReporter/README.md | 50 ++ gpii/node_modules/processReporter/index.js | 10 + .../node_modules/processReporter/package.json | 19 + .../processReporter/src/ProcessReporter.js | 71 +++ .../processReporter/src/processesBridge.js | 267 ++++++++++ .../test/web/html/ProcessReporterTest.html | 34 ++ .../test/web/html/ProcessesBridgeTest.html | 35 ++ .../test/web/js/ProcessReporterTests.js | 105 ++++ .../test/web/js/ProcessesBridgeTests.js | 302 ++++++++++++ index.js | 2 + package.json | 14 +- scripts/vagrantCloudBasedContainers.sh | 7 +- .../acceptanceTests/chrome.json | 5 - .../acceptanceTests/uioPlus.json | 5 + .../ontologies/mappings/ISO24751-flat.json5 | 13 +- .../ontologies/mappings/flat-apptology.json5 | 4 +- testData/preferences/MikelVargas.json | 4 +- .../acceptanceTests/chrome_high_contrast.json | 16 +- .../acceptanceTests/fm_gnome_keyboard.json | 4 +- .../preferences/acceptanceTests/giant.json | 14 + .../acceptanceTests/os_common.json | 2 +- .../uioPlus_character_space.json | 22 + .../acceptanceTests/uioPlus_defaults.json | 22 + .../acceptanceTests/uioPlus_font_size.json | 22 + .../uioPlus_high_contrast.json | 23 + .../uioPlus_highlight_colour.json | 22 + .../uioPlus_inputs_larger.json | 22 + .../acceptanceTests/uioPlus_line_space.json | 22 + .../uioPlus_multiple_settings.json | 23 + .../uioPlus_multiple_support_tool.json | 22 + .../acceptanceTests/uioPlus_self_voicing.json | 22 + .../acceptanceTests/uioPlus_simplified.json | 22 + .../acceptanceTests/uioPlus_support_tool.json | 22 + .../uioPlus_syllabification.json | 22 + .../acceptanceTests/uioPlus_toc.json | 22 + .../uioPlus_unhandled_support_tool.json | 22 + testData/preferences/chrome1.json | 15 - testData/preferences/chrome2.json | 21 - testData/preferences/chromeCommon.json | 18 - testData/preferences/uioPlusCommon.json | 23 + testData/preferences/uioPlusCommon.md | 18 + .../preferences/uioPlus_character_space.json | 22 + .../preferences/uioPlus_character_space.md | 5 + testData/preferences/uioPlus_defaults.json | 22 + testData/preferences/uioPlus_defaults.md | 5 + testData/preferences/uioPlus_font_size.json | 22 + testData/preferences/uioPlus_font_size.md | 5 + .../preferences/uioPlus_high_contrast.json | 23 + testData/preferences/uioPlus_high_contrast.md | 5 + .../preferences/uioPlus_highlight_colour.json | 22 + .../preferences/uioPlus_highlight_colour.md | 5 + .../preferences/uioPlus_inputs_larger.json | 22 + testData/preferences/uioPlus_inputs_larger.md | 5 + testData/preferences/uioPlus_line_space.json | 22 + testData/preferences/uioPlus_line_space.md | 5 + .../uioPlus_multiple_settings.json | 23 + .../preferences/uioPlus_multiple_settings.md | 20 + .../uioPlus_multiple_support_tool.json | 22 + .../uioPlus_multiple_support_tool.md | 5 + .../preferences/uioPlus_self_voicing.json | 22 + testData/preferences/uioPlus_self_voicing.md | 5 + testData/preferences/uioPlus_simplified.json | 22 + testData/preferences/uioPlus_simplified.md | 5 + .../preferences/uioPlus_support_tool.json | 22 + testData/preferences/uioPlus_support_tool.md | 5 + .../preferences/uioPlus_syllabification.json | 22 + .../preferences/uioPlus_syllabification.md | 5 + testData/preferences/uioPlus_toc.json | 22 + testData/preferences/uioPlus_toc.md | 5 + .../uioPlus_unhandled_support_tool.json | 22 + .../uioPlus_unhandled_support_tool.md | 5 + .../processReporter/runningSolutions.json | 172 +++++++ testData/solutions/linux.json5 | 198 ++++++-- .../com_ilunion_cloud4chrome.md | 51 -- .../solutionsDescription/net_gpii_uioPlus.md | 36 ++ testData/solutions/win32.json5 | 196 ++++++-- tests/ContextIntegrationTests.js | 2 +- tests/DevelopmentTests.js | 2 +- tests/DeviceReporterErrorTests.js | 2 +- tests/IntegrationTests.js | 2 +- tests/JournalIntegrationTests.js | 2 +- tests/PayloadSizeTest.js | 57 +++ tests/PreferencesServerErrorTests.js | 2 +- tests/StartupAPITests.js | 2 +- tests/UntrustedDevelopmentTests.js | 2 +- tests/all-tests.js | 2 + tests/platform/index-linux.js | 2 +- tests/platform/index-windows.js | 2 +- ...i.tests.acceptance.linux.chrome.config.txt | 8 - ...ests.acceptance.linux.uioPlus.config.json} | 6 +- ....tests.acceptance.linux.uioPlus.config.txt | 8 + tests/platform/linux/linux-chrome-testSpec.js | 108 ----- .../platform/linux/linux-chrome-testSpec.txt | 11 - .../platform/linux/linux-uioPlus-testSpec.js | 32 ++ .../platform/linux/linux-uioPlus-testSpec.txt | 19 + tests/platform/shared/uioPlusTestDefs.js | 459 ++++++++++++++++++ ...tests.acceptance.windows.chrome.config.txt | 8 - ...ts.acceptance.windows.uioPlus.config.json} | 6 +- ...ests.acceptance.windows.uioPlus.config.txt | 8 + .../windows/windows-chrome-testSpec.js | 110 ----- .../windows/windows-chrome-testSpec.txt | 11 - .../windows/windows-uioPlus-testSpec.js | 32 ++ .../windows/windows-uioPlus-testSpec.txt | 19 + tests/web/html/all-tests.html | 4 +- 130 files changed, 3792 insertions(+), 580 deletions(-) create mode 100644 gpii/node_modules/eventLog/README.md create mode 100644 gpii/node_modules/eventLog/index.js create mode 100644 gpii/node_modules/eventLog/package.json create mode 100644 gpii/node_modules/eventLog/src/eventLog.js create mode 100644 gpii/node_modules/eventLog/src/installID.js create mode 100644 gpii/node_modules/eventLog/test/EventLogTests.js create mode 100644 gpii/node_modules/processReporter/README.md create mode 100644 gpii/node_modules/processReporter/index.js create mode 100644 gpii/node_modules/processReporter/package.json create mode 100644 gpii/node_modules/processReporter/src/ProcessReporter.js create mode 100644 gpii/node_modules/processReporter/src/processesBridge.js create mode 100644 gpii/node_modules/processReporter/test/web/html/ProcessReporterTest.html create mode 100644 gpii/node_modules/processReporter/test/web/html/ProcessesBridgeTest.html create mode 100644 gpii/node_modules/processReporter/test/web/js/ProcessReporterTests.js create mode 100644 gpii/node_modules/processReporter/test/web/js/ProcessesBridgeTests.js delete mode 100644 testData/deviceReporter/acceptanceTests/chrome.json create mode 100644 testData/deviceReporter/acceptanceTests/uioPlus.json create mode 100644 testData/preferences/acceptanceTests/giant.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_character_space.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_defaults.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_font_size.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_high_contrast.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_highlight_colour.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_inputs_larger.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_line_space.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_multiple_settings.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_multiple_support_tool.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_self_voicing.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_simplified.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_support_tool.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_syllabification.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_toc.json create mode 100644 testData/preferences/acceptanceTests/uioPlus_unhandled_support_tool.json delete mode 100644 testData/preferences/chrome1.json delete mode 100644 testData/preferences/chrome2.json delete mode 100644 testData/preferences/chromeCommon.json create mode 100644 testData/preferences/uioPlusCommon.json create mode 100644 testData/preferences/uioPlusCommon.md create mode 100644 testData/preferences/uioPlus_character_space.json create mode 100644 testData/preferences/uioPlus_character_space.md create mode 100644 testData/preferences/uioPlus_defaults.json create mode 100644 testData/preferences/uioPlus_defaults.md create mode 100644 testData/preferences/uioPlus_font_size.json create mode 100644 testData/preferences/uioPlus_font_size.md create mode 100644 testData/preferences/uioPlus_high_contrast.json create mode 100644 testData/preferences/uioPlus_high_contrast.md create mode 100644 testData/preferences/uioPlus_highlight_colour.json create mode 100644 testData/preferences/uioPlus_highlight_colour.md create mode 100644 testData/preferences/uioPlus_inputs_larger.json create mode 100644 testData/preferences/uioPlus_inputs_larger.md create mode 100644 testData/preferences/uioPlus_line_space.json create mode 100644 testData/preferences/uioPlus_line_space.md create mode 100644 testData/preferences/uioPlus_multiple_settings.json create mode 100644 testData/preferences/uioPlus_multiple_settings.md create mode 100644 testData/preferences/uioPlus_multiple_support_tool.json create mode 100644 testData/preferences/uioPlus_multiple_support_tool.md create mode 100644 testData/preferences/uioPlus_self_voicing.json create mode 100644 testData/preferences/uioPlus_self_voicing.md create mode 100644 testData/preferences/uioPlus_simplified.json create mode 100644 testData/preferences/uioPlus_simplified.md create mode 100644 testData/preferences/uioPlus_support_tool.json create mode 100644 testData/preferences/uioPlus_support_tool.md create mode 100644 testData/preferences/uioPlus_syllabification.json create mode 100644 testData/preferences/uioPlus_syllabification.md create mode 100644 testData/preferences/uioPlus_toc.json create mode 100644 testData/preferences/uioPlus_toc.md create mode 100644 testData/preferences/uioPlus_unhandled_support_tool.json create mode 100644 testData/preferences/uioPlus_unhandled_support_tool.md create mode 100644 testData/processReporter/runningSolutions.json delete mode 100644 testData/solutions/solutionsDescription/com_ilunion_cloud4chrome.md create mode 100644 testData/solutions/solutionsDescription/net_gpii_uioPlus.md create mode 100644 tests/PayloadSizeTest.js delete mode 100644 tests/platform/linux/configs/gpii.tests.acceptance.linux.chrome.config.txt rename tests/platform/linux/configs/{gpii.tests.acceptance.linux.chrome.config.json => gpii.tests.acceptance.linux.uioPlus.config.json} (82%) create mode 100644 tests/platform/linux/configs/gpii.tests.acceptance.linux.uioPlus.config.txt delete mode 100644 tests/platform/linux/linux-chrome-testSpec.js delete mode 100644 tests/platform/linux/linux-chrome-testSpec.txt create mode 100644 tests/platform/linux/linux-uioPlus-testSpec.js create mode 100644 tests/platform/linux/linux-uioPlus-testSpec.txt create mode 100644 tests/platform/shared/uioPlusTestDefs.js delete mode 100644 tests/platform/windows/configs/gpii.tests.acceptance.windows.chrome.config.txt rename tests/platform/windows/configs/{gpii.tests.acceptance.windows.chrome.config.json => gpii.tests.acceptance.windows.uioPlus.config.json} (82%) create mode 100644 tests/platform/windows/configs/gpii.tests.acceptance.windows.uioPlus.config.txt delete mode 100644 tests/platform/windows/windows-chrome-testSpec.js delete mode 100644 tests/platform/windows/windows-chrome-testSpec.txt create mode 100644 tests/platform/windows/windows-uioPlus-testSpec.js create mode 100644 tests/platform/windows/windows-uioPlus-testSpec.txt diff --git a/documentation/BrowserChannel.md b/documentation/BrowserChannel.md index bd79bcd08..035678ba9 100644 --- a/documentation/BrowserChannel.md +++ b/documentation/BrowserChannel.md @@ -37,7 +37,7 @@ socket.on("open", function () { socket.send(JSON.stringify({ type: "connect", payload: { - solutionId: "com.ilunion.cloud4chrome" + solutionId: "net.gpii.uioPlus" } })); }); @@ -60,7 +60,7 @@ socket.on("message", function (data) { The workflow between the client and server can be summarised as follows: -* After connecting to the flow manager, the client sends a socket message to the channel, which is a payload containing the *id* of the client, in this instance `com.ilunion.cloud4chrome`. +* After connecting to the flow manager, the client sends a socket message to the channel, which is a payload containing the *id* of the client, in this instance `net.gpii.uioPlus`. * The client will be registered if the solution's id can be found of the solutions registry, otherwise, the registration will be rejected and the system will emit en error, and the client will disconnect. * When the flow manager emits either the _connectionSucceeded_ (after being registered) or the _onSettingsChanged_ (after a user login/logout) signal to the client, it is delivering the current available settings for the client in the following way: ``` diff --git a/documentation/RawPreferencesServer.md b/documentation/RawPreferencesServer.md index 4cdb182d1..d4617481b 100644 --- a/documentation/RawPreferencesServer.md +++ b/documentation/RawPreferencesServer.md @@ -6,7 +6,7 @@ Is part of the [Preferences Server Framework](PreferencesServerFramework.md) and The exposed REST API for the Raw Preferences Server is described below -###API +### API #### GET /rawPreferences/:token diff --git a/documentation/SolutionsRegistryFormat.md b/documentation/SolutionsRegistryFormat.md index 969e78b0a..25e5be802 100644 --- a/documentation/SolutionsRegistryFormat.md +++ b/documentation/SolutionsRegistryFormat.md @@ -1,4 +1,4 @@ -##Solutions Registry format +## Solutions Registry format ### Overall format: Each entry in the solution registry should have a unique ID (`Solution.id` in the below example), as well as a name (`name`), and a description of which context it requires to run (`context`). Besides these, information can be provided describing different potential aspects of its lifecycle. This can for example be information about how to start and stop the solution, detect whether it is running, set its settings, etc. These will all be described in the below. The overall structure and allowed keys in a solution description can be seen here. @@ -116,7 +116,7 @@ These four lifecycle blocks have different meanings to the system but has the sa * `start`: Launch/start the solution * `stop`: Stop/kill the solution -Each of these lifecycle blocks allow the same content - which is an array with entries that are either references to settingsHandlers blocks or customized lifecycle blocks. To reference a settingsHandler block, the keywork `settings.` is used, where `` should be replaced with the name of a settingsHandler block. In the case of `configure` and `start`, a consequence of referencing a settingsHandler is that the settings given in the settingsHandler and users preferences set will be applied to that solution (and their original values will be saved to the system - if user just logged in). In the case of `restore` and `stop`, the settings that has previously been written using the settingshandler(s) in question will be restored. Alternative to referencings setting and restoring settings, arbitrary lifecycle actions are allowed - the syntax for this is an object that contains at least a `type` key for the function to call. None of these blocks are mandatory. +Each of these lifecycle blocks allow the same content - which is an array with entries that are either references to settingsHandlers blocks or customized lifecycle blocks. To reference a settingsHandler block, the keyword `settings.` is used, where `` should be replaced with the name of a settingsHandler block. In the case of `configure` and `start`, a consequence of referencing a settingsHandler is that the settings given in the settingsHandler and users preferences set will be applied to that solution (and their original values will be saved to the system - if the user just logged in). In the case of `restore` and `stop`, the settings that have previously been written using the settingshandler(s) in question will be restored. Alternative to referencings setting and restoring settings, arbitrary lifecycle actions are allowed - the syntax for this is an object that contains at least a `type` key for the function to call. None of these blocks are mandatory. **Example blocks**: ``` @@ -199,7 +199,7 @@ To detect whether a solution is running - this is planned to be integrated in th ] ``` -####isConfigurable +#### isConfigurable This is run before configuration to ensure that the application is actually ready to be configured. This is relevant for applications where e.g. a configuration file needs to be present, a tutorial needs to be run on the first launch, etc. **Example Entry**: @@ -210,7 +210,7 @@ This is run before configuration to ensure that the application is actually read }] ``` -####makeConfigurable +#### makeConfigurable Is the actions that need to be taken to make the application configurable (such as running a wizard, creating a default configuration file, adding a new system user, etc). **Example Entry**: @@ -220,10 +220,10 @@ Is the actions that need to be taken to make the application configurable (such }] ``` -####install: +#### install: Used for describing the steps required for installing the application -####uninstall: +#### uninstall: Used for describing the steps required for uninstalling the application (i.e. completely removing it from the system) diff --git a/documentation/Transformer.md b/documentation/Transformer.md index ab361e5e8..66c9cc79b 100644 --- a/documentation/Transformer.md +++ b/documentation/Transformer.md @@ -1,4 +1,4 @@ -##Transformer +## Transformer ### Description The transformer component of the core framework is a supportive component for the fluid.infusions transformation capabilities. It is responsible for supporting transformations in the core framework that aren't directly achievable using the Infusion transformation framework. diff --git a/documentation/loginAndLogoutFlow.md b/documentation/loginAndLogoutFlow.md index 80e03e10b..8d8dbe5b3 100644 --- a/documentation/loginAndLogoutFlow.md +++ b/documentation/loginAndLogoutFlow.md @@ -5,19 +5,19 @@ This document describes the flow on a locally installed GPII system when the use ### Overview and APIs We support 3 different logon related URLs, namely: * `/user/:token/proximityTriggered` - change the logon state of the given token (i.e. log in or out) - ** **Debounce rule**: any RFID actions is ignored for if a login/logout for is in progress OR if the last login/logout process for finished less than 5 seconds ago - ** If no user is logged in and debounce doesn't apply, log in - ** If is logged in and debounce doesn't apply, log out - ** If another user is already logged in or in the process of logging in or out, log that user out and log in + * **Debounce rule**: any RFID actions is ignored for if a login/logout for is in progress OR if the last login/logout process for finished less than 5 seconds ago + * If no user is logged in and debounce doesn't apply, log in + * If is logged in and debounce doesn't apply, log out + * If another user is already logged in or in the process of logging in or out, log that user out and log in * `/user/:token/login` - log the token in - ** If no user is logged in, will be logged in - ** If another user is logged in, nothing will happen and an error is returned + * If no user is logged in, will be logged in + * If another user is logged in, nothing will happen and an error is returned * `/user/:token/logout` - log the token out - ** If no user is logged in, nothing happens - ** if user mytoken is logged in, he will be logged out - ** If another user is logged in, nothing will happen and an error is returned + * If no user is logged in, nothing happens + * if user mytoken is logged in, he will be logged out + * If another user is logged in, nothing will happen and an error is returned In general, the the `proximityTriggered` URL should be used by proximity devices. This will take the appropriate action depending on whether the user is logged into the system or not. @@ -39,20 +39,20 @@ The user login process is as follows: 1. a GET request is sent to either `/user/:token/login` or `/user/:token/proximityTriggered`. This is retrieved by the relevant handler in `UserLogonStateChange`, and if it is found that the token needs to be logged in, the `onUserToken` event is fired (via the `gpii.flowManager.userLogonHandling.loginUser` function) 1. the `onUserToken` event has three listeners: - * UserLogonStateChange's `getDeviceContext`, which fetches the device reporter data. When this has been fetched an `onDeviceContext` event is fired. - * `getPreferences` (flowManagerUtilities), which fetches the preferences and fires the `onPreferences` event when the preferences are fetched. - * `setUserToken` (flowManagerUtilities) which sets the userToken property in the handler + 1. UserLogonStateChange's `getDeviceContext`, which fetches the device reporter data. When this has been fetched an `onDeviceContext` event is fired. + 2. `getPreferences` (flowManagerUtilities), which fetches the preferences and fires the `onPreferences` event when the preferences are fetched. + 3. `setUserToken` (flowManagerUtilities) which sets the userToken property in the handler 1. the `onDeviceContext` event has one listener: - * `getSolutions` (flowManagerUtitilies), which fetches the solutions registry and filters it based on the device reporter info. The `onSolutions` event is fired with the result. + 1. `getSolutions` (flowManagerUtitilies), which fetches the solutions registry and filters it based on the device reporter info. The `onSolutions` event is fired with the result. 1. The `onReadyToMatch` event is listening to the three events described above: `onDeviceContext`, `onPreferences` and `onSolutions`. When these three events have been fired, the `onReadyToMatch` event will be triggered. 1. This event signal that all the resources has been fetched and the matchmaking related portion of the workflow starts. This is done via the `processMatch` pseudo event, which is listening to the `onReadyToMatch` event and triggered from it. The `processMatch` event kickes off a set of functions fired sequentially as dictated by the `flowManager.processMatch.priorities`. As with everything else in this flow, the sequence and ordering of the steps in the matchmaking process can be modified by the config/setup being used, and this document won't dive into the details of this flow except for some general observation: - * Generally some prioritized steps: `preProcess`, `matchMakerDispatcher`, `runContextManager`, `privacyFilter` and `transform` will be run (in that order). - * The end result of this process is a description of the configuration to be applied to system (described per appplication, filtered according to users privacy settings, etc). The even `onMatchDone` signals that we have the lifecycle instructions ready. For more details on the match maker frameworks internal workings, see: [Match Maker Framework Documentation](MatchMakerFramework.md) + 1. Generally some prioritized steps: `preProcess`, `matchMakerDispatcher`, `runContextManager`, `privacyFilter` and `transform` will be run (in that order). + 1. The end result of this process is a description of the configuration to be applied to system (described per appplication, filtered according to users privacy settings, etc). The even `onMatchDone` signals that we have the lifecycle instructions ready. For more details on the match maker frameworks internal workings, see: [Match Maker Framework Documentation](MatchMakerFramework.md) 1. `onMatchDone` is being listened to by the `startLifecycle` (UserLogonStateChange), which applies the settings to the system via the functionality in the LifecycleManager. ### Finally, there are some important events exposed on the `flowManager` component: -* userLoginInitiated: fired when the process of keying in a user (ie. configuring the system) starts, -* userLogoutInitiated: fired when the process of keying out a user (ie. restoring the system) has started, -* userLoginComplete: fired when the process of keying in a user (ie. configuring the system) has completed, -* userLogoutComplete: fired when the process of keying out a user (ie. restoring the system) has completed, \ No newline at end of file +* userLoginInitiated: fired when the process of keying in a user (ie. configuring the system) starts. +* userLogoutInitiated: fired when the process of keying out a user (ie. restoring the system) has started. +* userLoginComplete: fired when the process of keying in a user (ie. configuring the system) has completed. +* userLogoutComplete: fired when the process of keying out a user (ie. restoring the system) has completed. diff --git a/examples/browserChannelClient/browserChannelClient.js b/examples/browserChannelClient/browserChannelClient.js index 7d830c41e..88e00a458 100644 --- a/examples/browserChannelClient/browserChannelClient.js +++ b/examples/browserChannelClient/browserChannelClient.js @@ -29,7 +29,7 @@ socket.on("open", function () { socket.send(JSON.stringify({ type: "connect", payload: { - solutionId: "com.ilunion.cloud4chrome" // must match the solution id in (every) solutions registry + solutionId: "net.gpii.uioPlus" // must match the solution id in (every) solutions registry } })); }); diff --git a/gpii/node_modules/contextManager/src/ContextManager.js b/gpii/node_modules/contextManager/src/ContextManager.js index fbf3d8768..e7ae4f5bd 100644 --- a/gpii/node_modules/contextManager/src/ContextManager.js +++ b/gpii/node_modules/contextManager/src/ContextManager.js @@ -167,8 +167,8 @@ gpii.contextManager.evaluateConditions = function (that, lifecycleManager, conte var activeSession = lifecycleManager.getSession(activeSessions); var newActiveContexts = gpii.contextManager.utils.findActiveContexts(context, activeSession.model.matchMakerOutput); fluid.log("contextManager: New active contexts: " + newActiveContexts); - if (newActiveContexts[0] === activeSession.activeContextName) { - fluid.log("contextManager: Same context as before (" + activeSession.model.appliedContext + ") so doing nothing"); + if (newActiveContexts[0] === activeSession.model.activeContextName) { + fluid.log("contextManager: Same context as before (" + activeSession.model.activeContextName + ") so doing nothing"); return; } var activeConfiguration = activeSession.model.matchMakerOutput.inferredConfiguration[newActiveContexts[0]]; diff --git a/gpii/node_modules/deviceReporter/src/DeviceReporter.js b/gpii/node_modules/deviceReporter/src/DeviceReporter.js index fb681bbcd..eec4aec80 100644 --- a/gpii/node_modules/deviceReporter/src/DeviceReporter.js +++ b/gpii/node_modules/deviceReporter/src/DeviceReporter.js @@ -179,12 +179,11 @@ fluid.defaults("gpii.platformReporter", { } }, invokers: { - getBasicOS: "gpii.platformReporter.getBasicOS", reportPlatform: { funcName: "gpii.platformReporter.reportAll", - args: ["{that}", "{that}.getOSspecifics"] + args: ["{that}"] }, - getOSspecifics: "fluid.identity" + getBasicOS: "gpii.platformReporter.getBasicOS" } }); @@ -207,10 +206,10 @@ gpii.platformReporter.getBasicOS = function () { * and so on. * * @param that (Component) A platform reporter instance. - * @param getOSspecifics {Function} The context specific function to call to - * acquire OS specific platform information. + * @return (Object) An object that has properties describing platrform + * features/capabilities; at least basic information such ss + * the version of the OS. */ -gpii.platformReporter.reportAll = function (that, getOSspecifics) { - var allInfo = that.getBasicOS(); - return Object.assign(allInfo, getOSspecifics()); +gpii.platformReporter.reportAll = function (that) { + return that.getBasicOS(); }; diff --git a/gpii/node_modules/deviceReporter/test/PlatformReporterTests.js b/gpii/node_modules/deviceReporter/test/PlatformReporterTests.js index ffa5dfb1c..6e526815c 100644 --- a/gpii/node_modules/deviceReporter/test/PlatformReporterTests.js +++ b/gpii/node_modules/deviceReporter/test/PlatformReporterTests.js @@ -23,7 +23,10 @@ fluid.registerNamespace("gpii.tests.platformReporter"); fluid.defaults("gpii.tests.platformReporter", { gradeNames: ["gpii.platformReporter", "gpii.contexts.test"], invokers: { - getOSspecifics: "gpii.tests.platformReporter.getOSspecifics" + reportPlatform: { + funcName: "gpii.tests.platformReporter.reportAll", + args: ["{that}"] + } } }); @@ -40,10 +43,12 @@ gpii.tests.platformReporter.OSinfo = fluid.freezeRecursive({ /** * Return a mock of screen resolutions. * - * @return {Object} Current and available screen resolutions. + * @param that (Component) A platform reporter instance. + * @return {Object} Basic OS + current and available screen resolutions. */ -gpii.tests.platformReporter.getOSspecifics = function () { - return gpii.tests.platformReporter.OSinfo; +gpii.tests.platformReporter.reportAll = function (that) { + var allInfo = that.getBasicOS(); + return Object.assign(allInfo, gpii.tests.platformReporter.OSinfo); }; var platformReporter = gpii.tests.platformReporter(); @@ -60,17 +65,6 @@ jqUnit.test( jqUnit.assertNotNull("Version property", basicOS.version); } ); -jqUnit.test( - "Test getOSspecifics()", - function () { - var OSinfo = platformReporter.getOSspecifics(); - jqUnit.assertDeepEq( - "Platform OS informaiton", - gpii.tests.platformReporter.OSinfo, - OSinfo - ); - } -); jqUnit.test( "Test reportPlatform()", function () { diff --git a/gpii/node_modules/eventLog/README.md b/gpii/node_modules/eventLog/README.md new file mode 100644 index 000000000..e1e349ac5 --- /dev/null +++ b/gpii/node_modules/eventLog/README.md @@ -0,0 +1,13 @@ +# GPII Event Log + +Produces logs that can be read by a backend server for analysis and auditing. The log is in JSON format, and stored in +a file for an external process to send to the backend. + +Rather than transforming the fluid.log output, this module was produced so the debug log is still usable by humans and +it serves as a way of opting-in to sending only useful (and non-private) information. + +## See also + +* GPII-2398 +* GPII-2333 + diff --git a/gpii/node_modules/eventLog/index.js b/gpii/node_modules/eventLog/index.js new file mode 100644 index 000000000..f84e32237 --- /dev/null +++ b/gpii/node_modules/eventLog/index.js @@ -0,0 +1,26 @@ +/* + * Event logging. + * + * Copyright 2017 Raising the Floor - International + * + * Licensed under the New BSD license. You may not use this file except in + * compliance with this License. + * + * The R&D leading to these results received funding from the + * Department of Education - Grant H421A150005 (GPII-APCP). However, + * these results do not necessarily represent the policy of the + * Department of Education, and you should not assume endorsement by the + * Federal Government. + * + * You may obtain a copy of the License at + * https://github.com/GPII/universal/blob/master/LICENSE.txt + */ + +"use strict"; + +var fluid = require("infusion"); + +fluid.module.register("eventLog", __dirname, require); + +require("./src/installID.js"); +require("./src/eventLog.js"); diff --git a/gpii/node_modules/eventLog/package.json b/gpii/node_modules/eventLog/package.json new file mode 100644 index 000000000..36b94fcdb --- /dev/null +++ b/gpii/node_modules/eventLog/package.json @@ -0,0 +1,13 @@ +{ + "name": "eventLog", + "description": "Event logging.", + "version": "0.3.0", + "author": "GPII", + "bugs": "http://issues.gpii.net/browse/GPII", + "homepage": "http://gpii.net/", + "dependencies": {}, + "license" : "BSD-3-Clause", + "repository": "git://github.com/GPII/universal.git", + "main": "./index.js", + "engines": { "node" : ">=4.2.1" } +} \ No newline at end of file diff --git a/gpii/node_modules/eventLog/src/eventLog.js b/gpii/node_modules/eventLog/src/eventLog.js new file mode 100644 index 000000000..43bec6eec --- /dev/null +++ b/gpii/node_modules/eventLog/src/eventLog.js @@ -0,0 +1,267 @@ +/* + * Event logging. + * This acts upon events that are deemed interesting enough to be recorded and sent to a log server for analysis. The + * log produced here is in JSON and sent to a different output than the usual fluid.log. + * + * Copyright 2017 Raising the Floor - International + * + * Licensed under the New BSD license. You may not use this file except in + * compliance with this License. + * + * The R&D leading to these results received funding from the + * Department of Education - Grant H421A150005 (GPII-APCP). However, + * these results do not necessarily represent the policy of the + * Department of Education, and you should not assume endorsement by the + * Federal Government. + * + * You may obtain a copy of the License at + * https://github.com/GPII/universal/blob/master/LICENSE.txt + */ + +"use strict"; + +var fluid = require("infusion"); +var fs = require("fs"), + path = require("path"); + +var gpii = fluid.registerNamespace("gpii"), + $ = fluid.registerNamespace("jQuery"); + +fluid.registerNamespace("gpii.eventLog"); + +fluid.defaults("gpii.eventLog", { + gradeNames: ["fluid.component", "fluid.contextAware"], + contextAwareness: { + platform: { + checks: { + windows: { + contextValue: "{gpii.contexts.windows}", + gradeNames: "gpii.eventLog.windows" + } + } + } + }, + components: { + installID: { + type: "gpii.installID" + }, + settingsDir: { + type: "gpii.settingsDir" + } + }, + invokers: { + logEvent: "gpii.eventLog.log", + logError: "gpii.eventLog.logError", + getGpiiSettingsDir: "{settingsDir}.getGpiiSettingsDir", + getLogFile: "gpii.eventLog.getLogFile" + }, + members: { + // The log file. + logFilePath: null, + // The installation ID + installationID: "@expand:{that}.installID.getInstallID()" + }, + listeners: { + "onCreate.logFile": { + func: "gpii.eventLog.getLogFile", + args: ["{that}"] + }, + "onCreate.log": { + func: "{that}.logEvent", + args: ["{that}", "gpii", "Start", {}] + }, + "onDestroy.log": { + func: "{that}.logEvent", + args: [ "{that}", "gpii", "Stop", {}] + }, + "{lifecycleManager}.events.onSessionStart": { + namespace: "eventLog", + func: "{that}.logEvent", + args: [ + "{that}", + "lifecycle", + "SessionStart", + { + // onSessionStart fired with [gradeName, userToken] + userToken: "{arguments}.1", + session: "@expand:{lifecycleManager}.getSession({arguments}.1)" + } + ] + }, + "{lifecycleManager}.events.onSessionStop": { + namespace: "eventLog", + func: "{that}.logEvent", + args: [ + "{that}", + "lifecycle", + "SessionStop", + { + // onSessionStop fired with [{lifecycleManager}, {session}] + userToken: "{arguments}.1.model.userToken", + session: "{arguments}.1.id" + } + ] + } + } +}); + +/** + * Returns the actual Date and time + */ +gpii.eventLog.getTimestamp = function () { + return new Date(); +}; + +/** + * Creates an object for the log. Everything in this object is what will be logged, and the "time" field will be added + * later when it is actually logged. + * + * @param moduleName {String} The part of GPII causing this event. + * @param event {String} Name of the event. + * @param data [optional] Event specific data. + * @param level {Object} [optional] Level of the log, see fluid.logLevelsSpec [FATAL,FAIL,WARN,IMPORTANT,INFO,TRACE]. + * @return {Object} The log object. + */ +gpii.eventLog.createLogObject = function (moduleName, event, data, level) { + var eventObject = { + module: moduleName || "GPII", + event: event, + level: level + }; + + var hasValue = (data !== null && data !== undefined); + if (hasValue && fluid.isPlainObject(data)) { + hasValue = !$.isEmptyObject(data); + } + + if (hasValue) { + eventObject.data = fluid.copy(data); + // Replace any components in the data object with their id. + fluid.each(eventObject.data, function (value, key) { + if (fluid.isComponent(value)) { + eventObject.data[key] = value.id; + } + }); + } + return eventObject; +}; + +/** + * Logs an event. + * + * @param that {Component} The gpii.eventLog instance. + * @param moduleName {String} The part of GPII causing this event. + * @param event {String} The event name. + * @param data {Object} [optional] Event specific data. Can (shallowly) contain components, in which case just the ID is + * logged. + * @param level {Object} [optional] Level of the log, see fluid.logLevelsSpec [FATAL,FAIL,WARN,IMPORTANT,INFO,TRACE]. + */ +gpii.eventLog.log = function (that, moduleName, event, data, level) { + var eventObject = gpii.eventLog.createLogObject(moduleName, event, data, level); + gpii.eventLog.writeLog(that, level, eventObject); +}; + +/** + * Logs an error. + * + * @param that {Component} The gpii.eventLog instance. + * @param moduleName {String} The part of GPII causing this error. + * @param errType {String} Type of error. + * @param err {Object} The error. + * @param level {Object} [optional] Level of the log. default: fluid.logLevel.FAIL. + */ +gpii.eventLog.logError = function (that, moduleName, errType, err, level) { + if (!level) { + level = fluid.logLevel.FAIL; + } + + var data = {}; + if (err instanceof Error) { + // Error doesn't serialise + data.error = {}; + fluid.each(Object.getOwnPropertyNames(err), function (a) { + data.error[a] = err[a]; + }); + } else { + data.error = err; + } + + var eventObject = gpii.eventLog.createLogObject(moduleName, "Error." + errType, data); + gpii.eventLog.writeLog(that, fluid.logLevel.FAIL, eventObject); +}; + +// Log fluid.fail. +fluid.failureEvent.addListener(function (args) { + var err = Array.isArray(args) ? args.join(" ") : err; + gpii.eventLog.gotError(err); +}, "gpii-eventLog", "before:fail"); + +/** + * Logs an error caught by onUncaughtException or failureEvent. + * + * @param err The error. + */ +gpii.eventLog.gotError = function (err) { + var eventLog = fluid.queryIoCSelector(fluid.rootComponent, "gpii.eventLog"); + if (eventLog.length > 0) { + eventLog[0].logError(eventLog[0], null, "Failure", err); + } +}; + +// Log uncaught exceptions. +fluid.onUncaughtException.addListener(gpii.eventLog.gotError, "gpii-eventLog"); + +/** + * Gets the path of the new log file for this instance of gpii. + * + * @param that {Component} The gpii.eventLog instance. + */ +gpii.eventLog.getLogFile = function (that) { + var logFile = that.logFilePath || process.env.GPII_EVENT_LOG; + + if (!logFile) { + var startupTime = Date.now(); + var gpiiSettingsDir = that.getGpiiSettingsDir(); + logFile = path.join(gpiiSettingsDir, "gpii-" + gpii.journal.formatTimestamp(startupTime) + ".log"); + fluid.log(fluid.logLevel.IMPORTANT, "Writing event log to " + that.logFilePath); + } + + that.logFilePath = logFile; + + return that.logFilePath; +}; + +/** + * Writes an event to the log file. + * + * @param that {Component} The gpii.eventLog instance. + * @param level {Object} Level of the log, see fluid.logLevelsSpec [FATAL,FAIL,WARN,IMPORTANT,INFO,TRACE]. + * @param event {Object} The object. This will be modified to what has been sent to the log, adding the installID and + * timestamp fields. + */ +gpii.eventLog.writeLog = function (that, level, event) { + var intLevel = gpii.eventLog.checkLevel(level); + event.level = intLevel.value; + + // Log to console before the installation ID and timestamp are added (no one wants to see it). + fluid.log(fluid.logLevel.IMPORTANT, event); + + event.installID = that.installationID; + event.timestamp = gpii.eventLog.getTimestamp(); + fs.appendFileSync(that.logFilePath, JSON.stringify(event) + "\n"); +}; + +/** + * Ensure that the loglevel has a valid value. The levels are defined in the fluid.logLevelsSpec + * Sets INFO as default loglevel + * + * @param level to check, can be a string that represents the value or a property of fluid.logLevel + * @return a valid fluid.logLevel, with INFO as default + */ +gpii.eventLog.checkLevel = function (level) { + if (typeof level === "string" && level in fluid.logLevelsSpec) { + return fluid.logLevel[level]; + } else { + return fluid.isLogLevel(level) ? level : fluid.logLevel.INFO; + } +}; diff --git a/gpii/node_modules/eventLog/src/installID.js b/gpii/node_modules/eventLog/src/installID.js new file mode 100644 index 000000000..dfc4795f0 --- /dev/null +++ b/gpii/node_modules/eventLog/src/installID.js @@ -0,0 +1,98 @@ +/* + * Retrieves an "installation ID", which is something that uniquely identifies a particular machine. + * + * The installation ID is a string that's based on the OS specific "machine ID". + * + * Copyright 2017 Raising the Floor - International + * + * Licensed under the New BSD license. You may not use this file except in + * compliance with this License. + * + * The R&D leading to these results received funding from the + * Department of Education - Grant H421A150005 (GPII-APCP). However, + * these results do not necessarily represent the policy of the + * Department of Education, and you should not assume endorsement by the + * Federal Government. + * + * You may obtain a copy of the License at + * https://github.com/GPII/universal/blob/master/LICENSE.txt + */ + +"use strict"; + +var fluid = require("infusion"), + gpii = fluid.registerNamespace("gpii"), + fs = require("fs"), + crypto = require("crypto"); + +fluid.defaults("gpii.installID", { + gradeNames: ["fluid.component", "fluid.contextAware"], + contextAwareness: { + platform: { + checks: { + windows: { + contextValue: "{gpii.contexts.windows}", + gradeNames: "gpii.installID.windows" + }, + linux: { + contextValue: "{gpii.contexts.linux}", + gradeNames: "gpii.installID.standard" + } + } + } + }, + invokers: { + getInstallID: "gpii.installID.get({that}.getMachineID)", + getMachineID: "fluid.identity" + } +}); + +fluid.defaults("gpii.installID.standard", { + invokers: { + getMachineID: "gpii.installID.machineID.standard" + } +}); + +/** + * Gets the installation ID, using the given machine ID. + * + * @param getMachineID {Function} The OS specific function to get the machine ID. + * @return {string} The installation ID + */ +gpii.installID.get = function (getMachineID) { + var machineID = getMachineID(); + var installID; + + if (machineID) { + installID = crypto.createHash("sha1").update(machineID).digest("base64").substr(0, 10); + fluid.log(fluid.logLevel.IMPORTANT, "Installation ID: ", installID); + } else { + fluid.log(fluid.logLevel.WARN, "Unable to get installation ID"); + installID = "none"; + } + + return installID; +}; + +fluid.registerNamespace("gpii.installID.machineID"); + +/** + * Retrieve the machine ID from /etc/machine-id. + * + * @return {string} The machine ID. + */ +gpii.installID.machineID.standard = function () { + var togo; + var files = [ "/etc/machine-id", "/var/lib/dbus/machine-id" ]; + + for (var f in files) { + try { + togo = fs.readFileSync(files[f], "utf8"); + break; + } catch (e) { + // Continue. + } + } + + return togo; +}; diff --git a/gpii/node_modules/eventLog/test/EventLogTests.js b/gpii/node_modules/eventLog/test/EventLogTests.js new file mode 100644 index 000000000..d9eb7725a --- /dev/null +++ b/gpii/node_modules/eventLog/test/EventLogTests.js @@ -0,0 +1,387 @@ +/* + * eventLog Tests + * + * Copyright 2017 Raising the Floor - International + * + * Licensed under the New BSD license. You may not use this file except in + * compliance with this License. + * + * The R&D leading to these results received funding from the + * Department of Education - Grant H421A150005 (GPII-APCP). However, + * these results do not necessarily represent the policy of the + * Department of Education, and you should not assume endorsement by the + * Federal Government. + * + * You may obtain a copy of the License at + * https://github.com/GPII/universal/blob/master/LICENSE.txt + */ + +"use strict"; + +var fluid = require("infusion"), + fs = require("fs"), + os = require("os"), + readline = require("readline"); + +var jqUnit = fluid.require("node-jqunit"); +var gpii = fluid.registerNamespace("gpii"); +fluid.registerNamespace("gpii.tests.eventLog"); + +require("../index.js"); + +var teardowns = []; + +jqUnit.module("gpii.tests.eventLog", { + teardown: function () { + while (teardowns.length) { + teardowns.pop()(); + } + } +}); + +fluid.defaults("gpii.installID.test", { + invokers: { + getMachineID: "gpii.tests.eventLog.getMachineID" + } +}); + +gpii.tests.eventLog.getMachineID = function () { + return "TEST-MACHINE-ID"; +}; + +/** + * Creates a testable gpii.eventLog component. + * + * @param logFile {string} The log file + * @return {Component} gpii.eventLog + */ +gpii.tests.eventLog.createEventLogComponent = function (logFile) { + var eventLog = gpii.eventLog({ + gradeNames: "gpii.lifecycleManager", + distributeOptions: { + record: "gpii.installID.test", + target: "{that installID}.options.gradeNames" + }, + members: { + logFilePath: logFile, + installationID: gpii.tests.eventLog.installID + } + }); + teardowns.push(eventLog.destroy); + return eventLog; +}; + +gpii.tests.eventLog.installID = "installation-id"; +gpii.tests.eventLog.timestamp = "2000-00-00T00:00:00.000Z"; + +gpii.tests.eventLog.testDefs = fluid.freezeRecursive(fluid.transform([ + { + // generated by the component + testData: null, + expected: { + "level": "INFO", + "module": "gpii", + "event": "Start" + } + }, + { + // data object + testData: { + func: "log", + args: ["{that}", "module0", "event0", {"data0": "value0"}] + }, + expected: { + "level": "INFO", + "module": "module0", + "event": "event0", + "data": {"data0": "value0"} + } + }, + { + // no data + testData: { + func: "log", + args: ["{that}", "module1", "event1"] + }, + expected: { + "level": "INFO", + "module": "module1", + "event": "event1" + } + }, + { + // data string + testData: { + func: "log", + args: ["{that}", "module2", "event2", "value2"] + }, + expected: { + "level": "INFO", + "module": "module2", + "event": "event2", + "data": "value2" + } + }, + { + // data number + testData: { + func: "log", + args: ["{that}", "module3", "event3", 1234] + }, + expected: { + "level": "INFO", + "module": "module3", + "event": "event3", + "data": 1234 + } + }, + { + // empty data + testData: { + func: "log", + args: ["{that}", "module4", "event4", {}] + }, + expected: { + "level": "INFO", + "module": "module4", + "event": "event4" + } + }, + { + // null data + testData: { + func: "log", + args: ["{that}", "module5", "event5", null] + }, + expected: { + "level": "INFO", + "module": "module5", + "event": "event5" + } + }, + { + // test log level + testData: { + func: "log", + args: ["{that}", "module14", "event14", {"data0": "value0"}, fluid.logLevel.WARN] + }, + expected: { + "level": "WARN", + "module": "module14", + "event": "event14", + "data": {"data0": "value0"} + } + }, + { + // logError + testData: { + func: "logError", + args: ["{that}", "module15", "event15", {"error15": "value15"}] + }, + expected: { + "level": "FAIL", + "module": "module15", + "event": "Error.event15", + "data": { + "error": {"error15": "value15"} + } + } + } +], function (item) { + fluid.each(fluid.makeArray(item.expected), function (expected) { + expected.timestamp = gpii.tests.eventLog.timestamp; + expected.installID = gpii.tests.eventLog.installID; + }); + return item; +})); + +/** + * Sets up the logging so it's predictable and can be examined easily. + * + * @return {string} The log file. + */ +gpii.tests.eventLog.prepareLogFile = function () { + var logFile = os.tmpdir() + "/gpii-test-eventLog-" + Date.now(); + teardowns.push(function () { + fs.unlinkSync(logFile); + }); + + // Mock getTimestamp function + var oldGetTimestamp = gpii.eventLog.getTimestamp; + teardowns.push(function () { + // Restore getTimestamp. + gpii.eventLog.getTimestamp = oldGetTimestamp; + }); + gpii.eventLog.getTimestamp = function () { + return gpii.tests.eventLog.timestamp; + }; + + return logFile; +}; + +/** + * Checks a log line. + * + * @param line {String} The log lone. + * @param expected {Object} What it should parse into. + */ +gpii.tests.eventLog.checkLogLine = function (line, expected) { + jqUnit.expect(3); + jqUnit.assertTrue("Line should look like a JSON object", !!line.match(/^{.*}$/)); + var obj = JSON.parse(line); + jqUnit.assertEquals("JSON should be an object", "object", typeof(obj)); + + // data.duration is tricky to predict precisely, so just make sure it parses to a time within 5 seconds. + if (obj.data && obj.data.hasOwnProperty("duration")) { + jqUnit.expect(2); + jqUnit.assertTrue("data.duration property should be >= 0", obj.data.duration >= 0); + jqUnit.assertTrue("data.duration property shouldn't be more than 5 seconds", obj.data.duration < 5); + obj.data.duration = 0; + } + + jqUnit.assertDeepEq("Parsed log should match expected", expected, obj); +}; + +/** + * Checks an entire log file. + * + * @param logFile {String} The log file + * @param expected {Object[]} Array of objects expected for each line. + * @return {Promise} A promise that resolves when the file is read. + */ +gpii.tests.eventLog.checkLogFile = function (logFile, expected) { + var promise = fluid.promise(); + var reader = readline.createInterface({ + input: fs.createReadStream(logFile) + }); + + // Inspect each line of the log, making sure each one parses into the expected object. + var lineNumber = 0; + reader.on("line", function (line) { + console.log("Log line", lineNumber, line); + + if (lineNumber >= expected.length) { + jqUnit.fail("Log file should not contain more data."); + promise.reject(); + reader.close(); + return; + } + gpii.tests.eventLog.checkLogLine(line, expected[lineNumber]); + lineNumber++; + }); + + reader.on("close", function () { + if (!promise.disposition) { + promise.resolve(); + } + }); + + return promise; +}; + +jqUnit.asyncTest("Uncaught exception test", function () { + jqUnit.expect(1); + + var logFile = gpii.tests.eventLog.prepareLogFile(); + gpii.tests.eventLog.createEventLogComponent(logFile); + // Clear the log file + fs.unlinkSync(logFile); + + jqUnit.assertNotUndefined("Uncaught exception listener added", + fluid.onUncaughtException.listeners["gpii-eventLog"]); + + var errorText = "eventLog uncaught exception logging test"; + var expected = [ + { + "installID": gpii.tests.eventLog.installID, + "timestamp": gpii.tests.eventLog.timestamp, + "level": "FAIL", + "module": "GPII", + "event": "Error.Failure", + "data": { + "error": { + "testError": true, + "message": errorText + } + } + } + ]; + + // Disable jqUnit and fluid's handlers, to allow the test to continue when the exception is thrown. + fluid.failureEvent.addListener(fluid.identity, "jqUnit", "before:fail"); + fluid.onUncaughtException.addListener(fluid.identity, "fail", "first"); + + var promise = fluid.promise(); + process.nextTick(function () { + try { + throw { + testError: true, + message: errorText + }; + } finally { + // Resolve after the next tick - so the uncaught exception handler can be called. + setTimeout(promise.resolve, 1); + } + }); + + promise.then(function () { + fluid.failureEvent.removeListener("jqUnit"); + fluid.onUncaughtException.removeListener("fail"); + + gpii.tests.eventLog.checkLogFile(logFile, expected) + .then(jqUnit.start); + }); +}); + +jqUnit.asyncTest("fluid.fail test", function () { + var logFile = gpii.tests.eventLog.prepareLogFile(); + gpii.tests.eventLog.createEventLogComponent(logFile); + // Clear the log file + fs.unlinkSync(logFile); + + var errorText = "eventLog failure logging test"; + var expected = [ + { + "installID": gpii.tests.eventLog.installID, + "timestamp": gpii.tests.eventLog.timestamp, + "level": "FAIL", + "module": "GPII", + "event": "Error.Failure", + "data": {"error": errorText} + } + ]; + + // Test fluid.fail gets logged. + jqUnit.expectFrameworkDiagnostic("testing fluid.fail gets logged", function () { + fluid.fail(errorText); + }, [errorText]); + + gpii.tests.eventLog.checkLogFile(logFile, expected) + .then(jqUnit.start); +}); + +jqUnit.asyncTest("eventLog tests #1", function () { + var tests = gpii.tests.eventLog.testDefs; + var logFile = gpii.tests.eventLog.prepareLogFile(); + var expected = []; + + var that = gpii.tests.eventLog.createEventLogComponent(logFile); + + // Log the test data + for (var n = 0; n < tests.length; n++) { + var test = tests[n]; + var calls = fluid.makeArray(test.testData); + while (calls.length) { + var call = calls.shift(); + var args = fluid.transform(call.args, function (c) { + return (c === "{that}") ? that : c; + }); + gpii.eventLog[call.func].apply(null, args); + } + + expected.push.apply(expected, fluid.makeArray(test.expected)); + } + + gpii.tests.eventLog.checkLogFile(logFile, expected) + .then(jqUnit.start); +}); diff --git a/gpii/node_modules/flowManager/configs/gpii.flowManager.config.base.json b/gpii/node_modules/flowManager/configs/gpii.flowManager.config.base.json index 263a7c411..c0450b081 100644 --- a/gpii/node_modules/flowManager/configs/gpii.flowManager.config.base.json +++ b/gpii/node_modules/flowManager/configs/gpii.flowManager.config.base.json @@ -3,6 +3,7 @@ "options": { "mainServerPort": 8081, "authDBServerPort": 8058, + "payloadSizeLimit": "1mb", "distributeOptions": { "flowManager.deviceReporterDataSource": { "record": { @@ -39,6 +40,10 @@ "dbName": "auth" }, "target": "{that flowManager oauth2DataStore}.options.dataSourceConfig" + }, + "flowManager.payloadSizeLimit": { + "source": "{that}.options.payloadSizeLimit", + "target": "{that kettle.middleware.json}.options.middlewareOptions.limit" } }, "components": { diff --git a/gpii/node_modules/flowManager/src/FlowManager.js b/gpii/node_modules/flowManager/src/FlowManager.js index c5581f3f6..b66b4cdc9 100644 --- a/gpii/node_modules/flowManager/src/FlowManager.js +++ b/gpii/node_modules/flowManager/src/FlowManager.js @@ -33,6 +33,7 @@ require("lifecycleManager"); require("transformer"); require("journal"); require("singleInstance"); +require("eventLog"); fluid.defaults("gpii.flowManager", { gradeNames: ["kettle.app"], @@ -94,6 +95,12 @@ fluid.defaults("gpii.flowManager.local", { options: { gradeNames: ["gpii.journalLifecycleManager", "gpii.journalApp"] } + }, + eventLog: { + type: "gpii.eventLog", + options: { + gradeNames: ["gpii.eventLog"] + } } }, requestHandlers: { diff --git a/gpii/node_modules/flowManager/test/data/matchmaker.output.payload.json b/gpii/node_modules/flowManager/test/data/matchmaker.output.payload.json index cee875826..363a29558 100644 --- a/gpii/node_modules/flowManager/test/data/matchmaker.output.payload.json +++ b/gpii/node_modules/flowManager/test/data/matchmaker.output.payload.json @@ -420,7 +420,7 @@ "capabilities": [], "capabilitiesTransformations": { "stickykeys-enable": "http://registry\\.gpii\\.net/common/stickyKeys", - "slowkeys-enable": "http://registry\\.gpii\\.net/common/slowKeysEnable", + "slowkeys-enable": "http://registry\\.gpii\\.net/common/slowKeysEnabled", "slowkeys-delay": { "transform": { "type": "fluid.transforms.linearScale", @@ -428,7 +428,7 @@ "factor": 1000 } }, - "bouncekeys-enable": "http://registry\\.gpii\\.net/common/debounceEnable", + "bouncekeys-enable": "http://registry\\.gpii\\.net/common/debounceEnabled", "bouncekeys-delay": { "transform": { "type": "fluid.transforms.linearScale", diff --git a/gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/webTests/components/OKCancelDialog/html/OKCancelDialog-test.html b/gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/webTests/components/OKCancelDialog/html/OKCancelDialog-test.html index 946b018c3..02bfa6779 100644 --- a/gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/webTests/components/OKCancelDialog/html/OKCancelDialog-test.html +++ b/gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/webTests/components/OKCancelDialog/html/OKCancelDialog-test.html @@ -14,6 +14,8 @@ + + diff --git a/gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/webTests/components/login/html/Login-test.html b/gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/webTests/components/login/html/Login-test.html index 9e227c280..f5d347b52 100644 --- a/gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/webTests/components/login/html/Login-test.html +++ b/gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/webTests/components/login/html/Login-test.html @@ -14,6 +14,8 @@ + + diff --git a/gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/webTests/components/privacySettings/html/PrivacySettings-test.html b/gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/webTests/components/privacySettings/html/PrivacySettings-test.html index ac28bcd14..a3b2f63de 100644 --- a/gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/webTests/components/privacySettings/html/PrivacySettings-test.html +++ b/gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/webTests/components/privacySettings/html/PrivacySettings-test.html @@ -20,6 +20,8 @@ + + diff --git a/gpii/node_modules/gpii-oauth2/gpii-oauth2-utilities/test/html/OAuth2UtilitiesTests.html b/gpii/node_modules/gpii-oauth2/gpii-oauth2-utilities/test/html/OAuth2UtilitiesTests.html index 35a4c95b5..c3d3cce90 100644 --- a/gpii/node_modules/gpii-oauth2/gpii-oauth2-utilities/test/html/OAuth2UtilitiesTests.html +++ b/gpii/node_modules/gpii-oauth2/gpii-oauth2-utilities/test/html/OAuth2UtilitiesTests.html @@ -12,6 +12,8 @@ + + diff --git a/gpii/node_modules/lifecycleManager/src/LifecycleManager.js b/gpii/node_modules/lifecycleManager/src/LifecycleManager.js index cd4e68a4f..0ad7d60d3 100644 --- a/gpii/node_modules/lifecycleManager/src/LifecycleManager.js +++ b/gpii/node_modules/lifecycleManager/src/LifecycleManager.js @@ -643,8 +643,10 @@ var gpii = fluid.registerNamespace("gpii"); var userToken = finalPayload.userToken, lifecycleInstructions = finalPayload.activeConfiguration.lifecycleInstructions; var session = that.getSession([userToken]); - if (!session) { - fluid.fail("User with token " + userToken + " has no active session"); + if (!session) { // if user has logged out since the update was added to queue + var msg = "User with token " + userToken + " has no active session, so ignoring update request"; + fluid.log(msg); + return fluid.promise().resolve(msg); } var appliedSolutions = session.model.appliedSolutions; diff --git a/gpii/node_modules/lifecycleManager/test/js/LifecycleManagerTests.js b/gpii/node_modules/lifecycleManager/test/js/LifecycleManagerTests.js index 271f65105..79d9e631f 100644 --- a/gpii/node_modules/lifecycleManager/test/js/LifecycleManagerTests.js +++ b/gpii/node_modules/lifecycleManager/test/js/LifecycleManagerTests.js @@ -834,10 +834,12 @@ https://github.com/GPII/universal/blob/master/LICENSE.txt }); jqUnit.test("gpii.lifecycleManager.update() without active session", function () { - jqUnit.expectFrameworkDiagnostic("Error for update for user without session", function () { - var lifecycleManager = gpii.lifecycleManager(gpii.tests.lifecycleManager.testOptions); - lifecycleManager.update(gpii.tests.lifecycleManager.startPayload); - }, "session"); + var lifecycleManager = gpii.lifecycleManager(gpii.tests.lifecycleManager.testOptions); + var ret = lifecycleManager.update(gpii.tests.lifecycleManager.startPayload); + jqUnit.expect(1); + ret.then(function (text) { + jqUnit.assertTrue("User with token 123 has no active session, so ignoring update request", true); + }); }); gpii.tests.lifecycleManager.buildSequentialUpdateTests(); diff --git a/gpii/node_modules/matchMakerFramework/test/inverseCapabilities/os_win7_expected.json b/gpii/node_modules/matchMakerFramework/test/inverseCapabilities/os_win7_expected.json index 19e51d8f2..292961e3b 100644 --- a/gpii/node_modules/matchMakerFramework/test/inverseCapabilities/os_win7_expected.json +++ b/gpii/node_modules/matchMakerFramework/test/inverseCapabilities/os_win7_expected.json @@ -24,7 +24,7 @@ "http://registry.gpii.net/common/mouseEmulationEnabled": true }, "com.microsoft.windows.filterKeys": { - "http://registry.gpii.net/common/debounceEnable": true, + "http://registry.gpii.net/common/debounceEnabled": true, "http://registry.gpii.net/common/debounceInterval": 1 }, "com.microsoft.windows.screenResolution": {}, diff --git a/gpii/node_modules/preferencesServer/test/preferencesServerTests.js b/gpii/node_modules/preferencesServer/test/preferencesServerTests.js index d31a2cdb8..21cdabdcf 100644 --- a/gpii/node_modules/preferencesServer/test/preferencesServerTests.js +++ b/gpii/node_modules/preferencesServer/test/preferencesServerTests.js @@ -581,11 +581,11 @@ gpii.tests.preferencesServer.get.fixtures = [ "gpii-default": { "name": "Default preferences", "preferences": { - "http://registry.gpii.net/common/onScreenKeyboardEnabled": true, "http://registry.gpii.net/common/initDelay": 0.120, "http://registry.gpii.net/common/cursorSpeed": 0.850, "http://registry.gpii.net/common/cursorAcceleration": 0.800, "http://registry.gpii.net/common/mouseEmulationEnabled": true, + "http://registry.gpii.net/common/onScreenKeyboardEnabled": true, "http://registry.gpii.net/applications/org.alsa-project": { "volume": 14, "pitch": 100 @@ -597,9 +597,9 @@ gpii.tests.preferencesServer.get.fixtures = [ "http://registry\\.gpii\\.net/common/initDelay", "http://registry\\.gpii\\.net/common/stickyKeys", "http://registry\\.gpii\\.net/common/cursorSpeed", - "http://registry\\.gpii\\.net/common/slowKeysEnable", - "http://registry\\.gpii\\.net/common/debounceEnable", "http://registry\\.gpii\\.net/common/hapticFeedback", + "http://registry\\.gpii\\.net/common/slowKeysEnabled", + "http://registry\\.gpii\\.net/common/debounceEnabled", "http://registry\\.gpii\\.net/common/tableOfContents", "http://registry\\.gpii\\.net/common/slowKeysInterval", "http://registry\\.gpii\\.net/common/debounceInterval", @@ -617,18 +617,22 @@ gpii.tests.preferencesServer.get.fixtures = [ "scope": [ "http://registry\\.gpii\\.net/common/fontSize", "http://registry\\.gpii\\.net/common/tracking", + "http://registry\\.gpii\\.net/common/lineSpace", "http://registry\\.gpii\\.net/common/cursorSize", "http://registry\\.gpii\\.net/common/trackingTTS", "http://registry\\.gpii\\.net/common/invertImages", "http://registry\\.gpii\\.net/common/magnification", "http://registry\\.gpii\\.net/common/invertColours", "http://registry\\.gpii\\.net/common/mouseTrailing", + "http://registry\\.gpii\\.net/common/characterSpace", + "http://registry\\.gpii\\.net/common/highlightColor", "http://registry\\.gpii\\.net/common/foregroundColor", "http://registry\\.gpii\\.net/common/backgroundColor", "http://registry\\.gpii\\.net/common/fontFaceFontName", "http://registry\\.gpii\\.net/common/magnifierEnabled", "http://registry\\.gpii\\.net/common/magnifierPosition", "http://registry\\.gpii\\.net/common/highContrastTheme", + "http://registry\\.gpii\\.net/common/inputsLargerEnabled", "http://registry\\.gpii\\.net/common/highContrastEnabled", "http://registry\\.gpii\\.net/common/fontFaceGenericFontFace" ] diff --git a/gpii/node_modules/processReporter/README.md b/gpii/node_modules/processReporter/README.md new file mode 100644 index 000000000..d305fa449 --- /dev/null +++ b/gpii/node_modules/processReporter/README.md @@ -0,0 +1,50 @@ +Process Reporter +=== + +A fluid component that can be used to acquire information about the processes associated with a GPII solution. In particular, it can determine the running status of a solution. + +### Process Reporter API + +Given a solutions registry entry, the Process Reporter uses the information stored in the `isRunning` block to determine whether a solution has been launched and is currently running. For example, the `isRunning` block for the Orca screen reader (the solution entry `org.gnome.orca`) is as +follows: +``` +"isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "orca" + } +] +``` + +The Process Reporter's invoker `handleIsRunning(entry)` uses the `type` property and `commmand` properties, and returns either: + - `true`, if there is a running process corresponding to the `orca` command, + - `false`, if there is no running process corresponding to the `orca` command. + +### Special cases + +If the solutions registry entry does not have an `isRunning` block, then its run-state is not defined, and `handleIsRunning()` returns `undefined`. + +Most solutions run-state is based on a corresponding entry in the underlying OS's process or tasklist table. For example, the Linux/GNOME solution `org.gnome.orca` is running if the `orca` screen reader process is running. Similarly, on Windows, `org.nvda-project` is running if there is an `nvda` process in the tasklist. + +Some solutions, however, are not strictly process-oriented. An example is the GNOME Shell screen magnifier (solution `org.gnome.desktop.a11y.magnifier`). The magnifier is not a separate process, but is built into GNOME Shell. The magnifier is running if (1) the `gnome-shell` process is running and (2) the `org.gnome.desktop.a11y.applications screen-magnifier-enabled` GSetting is `true`. + +To handle such cases, the `isRunning` block contains an array of criteria to check. If all criteria are met, then the solution is running. The Process Reporter loops through and evaluates all the criteria. Continuing to use the GNOME Shell magnifier as the example: the Linux/GNOME implementation provides for checking both the status of the gnome-shell process and the magnfier GSetting: + +``` +"isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "gnome-shell" + }, + { + "type": "gpii.processReporter.checkSetting", + "schema": "org.gnome.desktop.a11y.applications", + "setting": "screen-magnifier-enabled", + "value": true + } +] +``` + +### Dependencies + +[infusion](https://github.com/fluid-project/infusion) framework. diff --git a/gpii/node_modules/processReporter/index.js b/gpii/node_modules/processReporter/index.js new file mode 100644 index 000000000..5c534537c --- /dev/null +++ b/gpii/node_modules/processReporter/index.js @@ -0,0 +1,10 @@ +"use strict"; + +var fluid = require("infusion"); + +fluid.module.register("processReporter", __dirname, require); + +require("./src/processesBridge.js"); +require("./src/ProcessReporter.js"); + + diff --git a/gpii/node_modules/processReporter/package.json b/gpii/node_modules/processReporter/package.json new file mode 100644 index 000000000..139aa7d18 --- /dev/null +++ b/gpii/node_modules/processReporter/package.json @@ -0,0 +1,19 @@ +{ + "name": "processReporter", + "description": "The Process Reporter module provides information about the platform and its running software", + "version": "0.1.0", + "author": "GPII", + "bugs": "http://issues.gpii.net/browse/GPII", + "homepage": "http://gpii.net/", + "dependencies": {}, + "licenses": [ + { + "type": "BSD-3-Clause", + "url": "http://www.opensource.org/licenses/BSD-3-Clause" + } + ], + "keywords": ["gpii", "accessibility", "settings", "fluid", "IoC", "Inversion of Control", "configuration", "evented"], + "repository": "git://github.com/GPII/universal.git", + "main": "./index.js", + "engines": { "node" : ">=4.2.18" } +} \ No newline at end of file diff --git a/gpii/node_modules/processReporter/src/ProcessReporter.js b/gpii/node_modules/processReporter/src/ProcessReporter.js new file mode 100644 index 000000000..06182adf3 --- /dev/null +++ b/gpii/node_modules/processReporter/src/ProcessReporter.js @@ -0,0 +1,71 @@ +/** + * GPII Process Reporter + * + * Copyright 2015-2017 OCAD University + * + * Licensed under the New BSD license. You may not use this file except in + * compliance with this License. + * + * You may obtain a copy of the License at + * https://github.com/GPII/universal/blob/master/LICENSE.txt + */ + +"use strict"; + +var fluid = fluid || require("infusion"), + gpii = fluid.registerNamespace("gpii"); + +fluid.defaults("gpii.processReporter", { + gradeNames: ["fluid.component"], + components: { + nameResolver: { + type: "gpii.processReporter.nameResolver" + } + }, + invokers: { + handleIsRunning: { + funcName: "gpii.processReporter.handleIsRunning", + args: ["{arguments}.0"] + // entry + } + } +}); + +fluid.defaults("gpii.processReporter.nameResolver", { + gradeNames: ["fluid.component"], + invokers: { + resolveName: { + funcName: "fluid.identity" + } + } +}); + +/* Marker function for use in isRunning sections of a launch handler + * to identify in a meaningful way that the solutions start block should always + * be run. + */ +fluid.defaults("gpii.processReporter.neverRunning", { + gradeNames: "fluid.function", + argumentMap: {} +}); + +gpii.processReporter.neverRunning = function () { + return false; +}; + +/** + * Runs the 'isRunning' entries of the 'entry' argument. If no 'isRunning' block is not present + * undefined is returned + */ +gpii.processReporter.handleIsRunning = function (entry) { + var running = undefined; + if (!!entry.isRunning) { + running = true; + + fluid.each (fluid.makeArray(entry.isRunning), function (aMember) { + var partial = fluid.invokeGradedFunction(aMember.type, aMember); + running = running && partial; + }); + } + return running; +}; diff --git a/gpii/node_modules/processReporter/src/processesBridge.js b/gpii/node_modules/processReporter/src/processesBridge.js new file mode 100644 index 000000000..b4d617994 --- /dev/null +++ b/gpii/node_modules/processReporter/src/processesBridge.js @@ -0,0 +1,267 @@ +/*! +GPII Process Reporter processes bridge, a component that encapsulates common +functions for retrieving information about OS processes with no requirement for +native (e.g., linux or windows) OS access. + +Copyright 2014 Inclusive Design Research Centre, OCAD University + +Licensed under the New BSD license. You may not use this file except in +compliance with this License. + +You may obtain a copy of the License at +https://github.com/gpii/universal/LICENSE.txt +*/ + +"use strict"; + +var fluid = fluid || require("infusion"); +var gpii = fluid.registerNamespace("gpii"); + +fluid.defaults("gpii.processes", { + gradeNames: ["fluid.component", "fluid.contextAware"], + contextAwareness: { + platform: { + checks: { + linux: { + contextValue: "{gpii.context.linux}", + gradeNames: "gpii.processes.linux" + }, + windows: { + contextValue: "{gpii.context.windows}", + gradeNames: "gpii.processes.windows" + } + } + } + }, + invokers: { + findSolutionsByCommands: { + funcName: "gpii.processes.findSolutionsByCommands", + args: ["{that}", "{arguments}.0"] + // array of command names + }, + findSolutionsByPids: { + funcName: "gpii.processes.findSolutionsByPids", + args: ["{that}", "{arguments}.0"] + // array of pids (process ids) + }, + findProcessByPid: { + funcName: "gpii.processes.findProcessByPid", + args: ["{that}", "{arguments}.0", "{arguments}.1"] + // pid, procArray (optional) + }, + findProcessesByCommand: { + funcName: "gpii.processes.findProcessesByCommand", + args: ["{that}", "{arguments}.0", "{arguments}.1"] + // command, procArray (optional) + }, + findFirstProcessByCommand: { + funcName: "gpii.processes.findFirstProcessByCommand", + args: ["{that}", "{arguments}.0", "{arguments}.1"] + // command, procArray (optional) + }, + isRunning: { + funcName: "gpii.processes.isRunning", + args: ["{that}", "{arguments}.0"] + // state (string) + }, + updateProcInfo: { + funcName: "gpii.processes.updateProcInfo", + args: ["{that}", "{arguments}.0"] + // process info structure + }, + initProcInfoNotRunning: { + funcName: "gpii.processes.initProcInfoNotRunning", + args: ["{that}", "{arguments}.0"] + // command name (string) + }, + // Context aware invokers. + getProcessList : { + funcName: "gpii.processes.getProcessList", + args: ["{arguments}.0"] + // optional string or numeric identifier of the process + } + } +}); + +/** + * Return a list of process information objects corresponding to the names + * of each of the passed in commands. If nothing is found, returns an empty + * array. + * + * @param that {Component} - an instance of a processes component. + * @param commandNames {Array of String} - the names of the processes to inspect. + * @return {Array} - Array of procInfo objects for each command name. Empty + * if no processes are found. + */ +gpii.processes.findSolutionsByCommands = function (that, commandNames) { + return fluid.accumulate(commandNames, function (aCommand, matches) { + var procInfos = that.findProcessesByCommand(aCommand); + matches = matches.concat(procInfos); + return matches; + }, []); +}; + +/** + * Return an list of process information objects corresponding to the + * pids (process id numbers) passed in. If nothing is found, returns an empty + * array. + * + * @param that {Component} - an instance of a processes component. + * @param pids {Array of Number} - the process ids of the processes to inspect. + * @return {Array of ProcInfo} - Array of procInfo objects for each pid. Empty + * if no corresponding processes are found. + */ +gpii.processes.findSolutionsByPids = function (that, pids) { + return fluid.accumulate(pids, function (aPid, matches) { + var found = that.findProcessByPid(aPid); + if (found !== null) { + matches.push(found); + } + return matches; + }, []); +}; + +/** + * Return a process information object corresponding to THE given process + * id (process id number). Returns null if there is no such process. + * + * @param that {Component} - an instance of a processes component. + * @param pid {Number} - the process id of the processe to inspect. + * @param procArray {Array of ProcInfo} [optional] - an array of process information + * objects to search. + * @return {ProcInfo} - A process information object for the process with the + * given id. Returns null if there is no such process. + */ +gpii.processes.findProcessByPid = function (that, pid, procArray) { + if (!procArray) { + procArray = that.getProcessList(pid); + } + return fluid.find(procArray, function (procInfo) { + if (procInfo.pid === pid) { + return procInfo; + } + }, null); +}; + +/** + * Return a list of process information objects that match the given + * command name. Return san empty array if not matching name is found. + * + * @param that {Component} - an instance of a processes component. + * @param commandName {String} - the name of the processe to inspect. + * @param procArray {Array of ProcInfo} [optional] - an array of process information + * objects to search. + * @return {Array of ProcInfo} - Array of procInfo objects matching the command name. Empty + * if no corresponding processes are found. + */ +gpii.processes.findProcessesByCommand = function (that, commandName, procArray) { + if (!procArray) { + procArray = that.getProcessList(commandName); + } + return fluid.accumulate(procArray, function (aProcInfo, matchingProcs) { + if (aProcInfo.command === commandName) { + matchingProcs.push(aProcInfo); + } + return matchingProcs; + }, []); +}; + +/** + * Return the first process of an array of processes all with the same + * command name. If there are no matching names, return null. + * + * @param that {Component} - an instance of a processes component. + * @param commandName {String} - the name of the processe to inspect. + * @param procArray {Array of ProcInfo} [optional] - an array of process information + * objects to search. + * @return {Object} - A process information object for the process with the + * given id, null if there is no such process. + */ +gpii.processes.findFirstProcessByCommand = function (that, commandName, procArray) { + var commands = that.findProcessesByCommand(commandName, procArray); + if (commands.length > 0) { + return commands[0]; + } + else { + return null; + } +}; + +// Map to reduce process state values into "Running" (= true) vs. "Not Running" +// (= false). +gpii.processes.stateToRunning = fluid.freezeRecursive({ + "Running": true, + "Uninterruptible": true, + "Sleeping": true, + "Stopped": true, + "Zombie": false, + "NoSuchProcess": false +}); + +/** + * Determine if a process is running based on its native state. + * + * @param that {Component} - an instance of a processes component. + * @param state {String} - Native state of the process + * @return {Boolean} - Returns true if the process is running, false otherwise. + */ +gpii.processes.isRunning = function (that, state) { + return gpii.processes.stateToRunning[state]; +}; + +/** + * Renew the information about a process, or create a new "no such process" + * information object. + * + * @param that {Component} - an instance of a processes component. + * @param procInfo {ProcInfo} - Latest information about a process. + * @return {ProcInfo} - Returns a new process information object about the process. + */ +gpii.processes.updateProcInfo = function (that, procInfo) { + var newProcInfo = null; + if (procInfo.state === "NoSuchProcess") { + newProcInfo = + that.findFirstProcessByCommand(procInfo.command); + } + else { + newProcInfo = that.findProcessByPid(procInfo.pid); + } + if (newProcInfo === null) { + newProcInfo = + that.initProcInfoNotRunning(procInfo.command); + } + return newProcInfo; +}; + +/** + * Create process information object for a not-running process. + * + * @param that {Component} - an instance of a processes component. + * @param command {String} - Name of the process. + * @return {ProcInfo} - Returns a new process information object initialized as + * if the process is not running. + */ +gpii.processes.initProcInfoNotRunning = function (that, command) { + return fluid.freezeRecursive({ + "command": command, + "pid": -1, + "ppid": -1, + "uid": -1, + "gid": -1, + "fullPath": "", + "argv": "", + "state": "NoSuchProcess" + }); +}; + +/** + * Default function for the base 'gpii.processes' grade to return an empty list + * of process information objects. + * + * @param identifier {Number} or {String} - Optional process id number or + * command name of the process. + * @return {Array} - Returns an empty list. + */ +gpii.processes.getProcessList = function (/* identifier */) { + return []; +}; diff --git a/gpii/node_modules/processReporter/test/web/html/ProcessReporterTest.html b/gpii/node_modules/processReporter/test/web/html/ProcessReporterTest.html new file mode 100644 index 000000000..5d3df1cf1 --- /dev/null +++ b/gpii/node_modules/processReporter/test/web/html/ProcessReporterTest.html @@ -0,0 +1,34 @@ + + + + + GPII Process Reporter Tests + + + + + + + + + + + + + + + + + + + +

GPII Process Reporter Tests

+

+
+

+
    + + + + diff --git a/gpii/node_modules/processReporter/test/web/html/ProcessesBridgeTest.html b/gpii/node_modules/processReporter/test/web/html/ProcessesBridgeTest.html new file mode 100644 index 000000000..23c853450 --- /dev/null +++ b/gpii/node_modules/processReporter/test/web/html/ProcessesBridgeTest.html @@ -0,0 +1,35 @@ + + + + + GPII Processes Bridge Tests + + + + + + + + + + + + + + + + + + + +

    GPII Processes Bridge Tests

    +

    +
    +

    +
      + + + + diff --git a/gpii/node_modules/processReporter/test/web/js/ProcessReporterTests.js b/gpii/node_modules/processReporter/test/web/js/ProcessReporterTests.js new file mode 100644 index 000000000..ad8d7ab38 --- /dev/null +++ b/gpii/node_modules/processReporter/test/web/js/ProcessReporterTests.js @@ -0,0 +1,105 @@ +/* + * Process Reporter Tests + * + * Copyright 2017 Raising the Floor - International + * + * Licensed under the New BSD license. You may not use this file except in + * compliance with this License. + * + * You may obtain a copy of the License at + * https://github.com/GPII/universal/blob/master/LICENSE.txt + */ + +/* global fluid, jqUnit, gpii */ + +"use strict"; + +(function () { + fluid.registerNamespace("gpii.tests.processReporter"); + + fluid.defaults("gpii.tests.processReporter.alwaysTrue", { + gradeNames: "fluid.function", + argumentMap: {} + }); + + gpii.tests.processReporter.alwaysTrue = function () { + return true; + }; + + fluid.defaults("gpii.tests.processReporter.alwaysFalse", { + gradeNames: "fluid.function", + argumentMap: {} + }); + + gpii.tests.processReporter.alwaysFalse = function () { + return false; + }; + + gpii.tests.processReporter.handleIsRunningSpecs = { + "No isRunning block": { + input: {}, + expected: undefined + }, + "Single true entry as object": { + input: { + isRunning: { + "type": "gpii.tests.processReporter.alwaysTrue" + } + }, + expected: true + }, + "Single true entry as array": { + input: { + isRunning: [{ + "type": "gpii.tests.processReporter.alwaysTrue" + }] + }, + expected: true + }, + "Single false entry": { + input: { + isRunning: [{ + "type": "gpii.tests.processReporter.alwaysFalse" + }] + }, + expected: false + }, + "true + false => false": { + input: { + isRunning: [{ + "type": "gpii.tests.processReporter.alwaysTrue" + }, { + "type": "gpii.tests.processReporter.alwaysFalse" + }] + }, + expected: false + }, + "false + true => false": { + input: { + isRunning: [{ + "type": "gpii.tests.processReporter.alwaysFalse" + }, { + "type": "gpii.tests.processReporter.alwaysTrue" + }] + }, + expected: false + }, + "true + true => true": { + input: { + isRunning: [{ + "type": "gpii.tests.processReporter.alwaysTrue" + }, { + "type": "gpii.tests.processReporter.alwaysTrue" + }] + }, + expected: true + } + }; + + jqUnit.test("gpii.processReporter.handleIsRunning tests", function () { + fluid.each(gpii.tests.processReporter.handleIsRunningSpecs, function (spec, title) { + var actual = gpii.processReporter.handleIsRunning(spec.input); + jqUnit.assertEquals(title, spec.expected, actual); + }); + }); +})(); diff --git a/gpii/node_modules/processReporter/test/web/js/ProcessesBridgeTests.js b/gpii/node_modules/processReporter/test/web/js/ProcessesBridgeTests.js new file mode 100644 index 000000000..5ed148dd2 --- /dev/null +++ b/gpii/node_modules/processReporter/test/web/js/ProcessesBridgeTests.js @@ -0,0 +1,302 @@ +/* +GPII Web Processes Bridge Unit Tests + +Copyright 2014-2017 Inclusive Design Research Centre, OCAD University + +Licensed under the New BSD license. You may not use this file except in +compliance with this License. + +You may obtain a copy of the License at +https://github.com/gpii/universal/LICENSE.txt +*/ + +/* global fluid, jqUnit, require, gpii */ + +"use strict"; + +fluid.registerNamespace("gpii.tests.processes"); + +// Mock 'node' process. +gpii.tests.processes.mockNode = fluid.freezeRecursive({ + command: "node", + pid: 2345, + ppid: 968, + uid: 501, + gid: 20, + fullPath: "/usr/local/bin/node", + argv: ["/usr/local/bin/node"], + state: "Running" +}); + +// mock 'firefox' process +gpii.tests.processes.mockFirefox = fluid.freezeRecursive({ + command: "firefox", + pid: 2563, + ppid: 1, + uid: 501, + gid: -1, + fullPath: "/Applications/Firefox8.app/Contents/MacOS/firefox", + argv: ["/Applications/Firefox8.app/Contents/MacOS/firefox", "-foreground"], + state: "Sleeping" +}); + +// Mock list of running processes. +gpii.tests.processes.mockProcessesList = [ + gpii.tests.processes.mockNode, + gpii.tests.processes.mockFirefox, + { + command: "node", // second mock node process -- different user + pid: 666, + ppid: 968, + uid: 505, + gid: 20, + fullPath: "/usr/local/bin/node", + argv: ["/usr/local/bin/node"], + state: "Running" + }, { + command: "BBEdit", + pid: 2725, + ppid: 1, + uid: 501, + gid: 20, + fullPath: "Applications/BBEdit.app/Contents/MacOS/BBEdit", + argv: ["Applications/BBEdit.app/Contents/MacOS/BBEdit", "file.txt"], + state: "Stopped" + } +]; + +fluid.defaults("gpii.tests.processes.mock", { + gradeNames: ["gpii.processes", "gpii.contexts.test"], + members: { + mockNode: gpii.tests.processes.mockNode, + mockFirefox: gpii.tests.processes.mockFirefox + }, + invokers: { + getProcessList: { + funcName: "gpii.tests.getProcessList", + args: ["{arguments}.0"] + } + } +}); + +gpii.tests.getProcessList = function (identifier) { + var togo; + var aProcInfo = null; + if (identifier) { + aProcInfo = fluid.find( + gpii.tests.processes.mockProcessesList, + function (procInfo) { + if (procInfo.pid === identifier) { + return procInfo; + } + }, null + ); + } + if (aProcInfo) { + togo = [aProcInfo]; + } else { + togo = gpii.tests.processes.mockProcessesList; + } + return togo; +}; + +/** + * "Start" firefox if not alreday running. Simulated by adding the mock firefox + * process to the list of processes member of the given proceesesBridge, if not + * already present in the list. + * + * @param processesBridge {Component}. + */ +gpii.tests.processes.startFireFox = function (processesBridge) { + var procInfo = processesBridge.findProcessByPid(processesBridge.mockFirefox.pid); + // Start only if not running. + if (procInfo === null) { + processesBridge.getProcessList().push(processesBridge.mockFirefox); + } +}; + +/** + * "Stop" firefox if not alreday running. Simulated by removing the mock + * firefox process from the list of processes member of the given + * proceesesBridge, if present in the list. + * + * @param processesBridge {Component}. + */ +gpii.tests.processes.stopFireFox = function (processesBridge) { + var procInfo = processesBridge.findProcessByPid(processesBridge.mockFirefox.pid); + // Stop only if running. + if (procInfo !== null) { + var index = processesBridge.getProcessList().indexOf(procInfo); + processesBridge.getProcessList().splice(index, 1); + } +}; + +gpii.tests.processes.runTests = function () { + var processesBridge = gpii.tests.processes.mock(); + jqUnit.module("Processes Bridge"); + jqUnit.test( + "Test getProcessList()/findProcessByPid() with specified node process", + function () { + var procInfos = processesBridge.getProcessList(); + jqUnit.assertNotEquals( + "Listing all processes", 0, procInfos.length + ); + // Check for the presence of "node". + var nodeProc = processesBridge.findProcessByPid(processesBridge.mockNode.pid, procInfos); + jqUnit.assertNotNull("Searching for 'node' process", nodeProc); + } + ); + + jqUnit.test( + "Test findProcessByPid() with non-running process id", + function () { + jqUnit.assertNull( + "Search negative process id value", processesBridge.findProcessByPid(-1) + ); + } + ); + + jqUnit.test( + "Test findProcessByPid() against mock node process object.", + function () { + var nodeProcInfo = processesBridge.findProcessByPid(processesBridge.mockNode.pid); + + jqUnit.assertEquals("Node process 'name'", + processesBridge.mockNode.command, nodeProcInfo.command); + + jqUnit.assertEquals("Node process 'pid'", + processesBridge.mockNode.pid, nodeProcInfo.pid); + + jqUnit.assertEquals("Node process 'uid'", + processesBridge.mockNode.uid, nodeProcInfo.uid); + + jqUnit.assertEquals("Node process 'gid'", + processesBridge.mockNode.gid, nodeProcInfo.gid); + + jqUnit.assertEquals("Node process 'argv' length'", + processesBridge.mockNode.argv.length, nodeProcInfo.argv.length); + + jqUnit.assertEquals("Node process status", + "Running", processesBridge.mockNode.state); + + jqUnit.assertEquals("Node process fullPath", + processesBridge.mockNode.fullPath, nodeProcInfo.fullPath); + + jqUnit.assertDeepEq("Node process argv", + processesBridge.mockNode.argv, nodeProcInfo.argv); + } + ); + + jqUnit.test( + "Test findProcessesByCmd()/findFirstProcessByCmd()", + function () { + var nodeProcInfos = processesBridge.findProcessesByCommand("node"); + jqUnit.assertNotEquals( + "Getting all 'node' processes", 0, nodeProcInfos.length + ); + nodeProcInfos.forEach(function (aProcInfo) { + jqUnit.assertEquals( + "Node commmand name", "node", aProcInfo.command + ); + }); + var procInfo = processesBridge.findFirstProcessByCommand("node"); + jqUnit.assertNotNull( + "Looking for first 'node' processes", procInfo); + jqUnit.assertEquals("Node commmand name", "node", procInfo.command); + } + ); + + jqUnit.test( + "Test initProcInfoNotRunning()", + function () { + var notRunning = processesBridge.initProcInfoNotRunning("grep"); + jqUnit.assertEquals("Command name", notRunning.command, "grep"); + jqUnit.assertEquals("Negative process id", notRunning.pid, -1); + jqUnit.assertEquals( + "'NoSuchProcess' state", notRunning.state, "NoSuchProcess" + ); + jqUnit.assertNull( + "Search negative process id value", + processesBridge.findProcessByPid(notRunning.pid) + ); + } + ); + + jqUnit.test( + "Test isRunning() with mock node process, and nonexistent process", + function () { + var procInfo = processesBridge.findProcessByPid(processesBridge.mockNode.pid); + jqUnit.assertNotNull("Searching for 'node' process", procInfo); + jqUnit.assertTrue( + "Check node is running", + processesBridge.isRunning(procInfo.state) + ); + procInfo = processesBridge.initProcInfoNotRunning("grep"); + jqUnit.assertFalse( + "Check nonexistent process running", + processesBridge.isRunning(procInfo.state) + ); + } + ); + + jqUnit.test( + "Test updateProcInfo() against non-changing process", + function () { + var procInfo = processesBridge.findProcessByPid(processesBridge.mockNode.pid); + jqUnit.assertNotNull("Looking for 'node' processes", procInfo); + var newProcInfo = processesBridge.updateProcInfo(procInfo); + jqUnit.assertDeepEq( + "Check change in process info", procInfo, newProcInfo + ); + } + ); + + jqUnit.test( + "Test updateProcInfo() against changing process", + function () { + // "Start" firefox by adding to the process list. + gpii.tests.processes.startFireFox(processesBridge); + var fireFoxInfo = processesBridge.findProcessByPid(processesBridge.mockFirefox.pid); + jqUnit.assertNotNull("Search 'firefox' process", fireFoxInfo); + + // "Kill" firefox by removing it from the process list. + gpii.tests.processes.stopFireFox(processesBridge); + var newFireFoxInfo = processesBridge.updateProcInfo(fireFoxInfo); + jqUnit.assertNotEquals( + "Update process state", newFireFoxInfo.state, fireFoxInfo.state + ); + } + ); + + jqUnit.test( + "Test findSolutionsByCommands()", + function () { + // Node is running. Add a running firefox. No such command as T6y7u8i9. + gpii.tests.processes.startFireFox(processesBridge); + var solutions = ["node", "firefox", "T6y7u8i9"]; + var procInfos = processesBridge.findSolutionsByCommands(solutions); + jqUnit.assertTrue("Node and Firefox processes", procInfos.length >= 2); + procInfos.forEach(function (item) { + var isNode = item.command === "node"; + var isFirefox = item.command === "firefox"; + jqUnit.assertTrue("Process name 'node' or 'firefox'", isNode || isFirefox); + }); + } + ); + + jqUnit.test( + "Test findSolutionsByPids()", + function () { + // Node is running. Add a running Firefox process. + gpii.tests.processes.startFireFox(processesBridge); + var pids = [processesBridge.mockNode.pid, processesBridge.mockFirefox.pid]; + var procInfos = processesBridge.findSolutionsByPids(pids); + jqUnit.assertEquals("Node and Firefox processes", 2, procInfos.length); + procInfos.forEach(function (item) { + var isNode = item.pid === processesBridge.mockNode.pid; + var isFirefox = item.pid === processesBridge.mockFirefox.pid; + jqUnit.assertTrue("Process pid 'node' or 'firefox'", isNode || isFirefox); + }); + } + ); +}; diff --git a/index.js b/index.js index c283677e0..48cf8130d 100644 --- a/index.js +++ b/index.js @@ -38,6 +38,8 @@ require("./gpii/node_modules/canopyMatchMaker"); require("./gpii/node_modules/contextManager"); require("./gpii/node_modules/journal"); require("./gpii/node_modules/pouchManager"); +require("./gpii/node_modules/eventLog"); +require("./gpii/node_modules/processReporter"); gpii.loadTestingSupport = function () { fluid.contextAware.makeChecks({ diff --git a/package.json b/package.json index 61f0aceca..124cf6e29 100644 --- a/package.json +++ b/package.json @@ -8,17 +8,17 @@ "dependencies": { "body-parser": "1.17.2", "connect-ensure-login": "0.1.1", - "express": "4.15.3", + "express": "4.15.4", "express-handlebars": "3.0.0", - "express-session": "1.15.4", + "express-session": "1.15.5", "fluid-resolve": "1.3.0", "glob": "7.1.2", "gpii-pouchdb": "1.0.7", - "infusion": "3.0.0-dev.20170727T125648Z.47055ca", + "infusion": "3.0.0-dev.20170830T182157Z.392b2f8", "ini": "git://github.com/GPII/ini.git#be8a04aa22f5ad9321ebcbba7740314a53bc8ab2", "json5": "0.5.1", - "kettle": "1.6.4", - "node-jqunit": "1.1.6", + "kettle": "1.7.0", + "node-jqunit": "1.1.7", "node-uuid": "1.4.8", "mkdirp": "0.5.1", "oauth2orize": "1.8.0", @@ -26,8 +26,8 @@ "passport-local": "1.0.0", "passport-oauth2-client-password": "0.1.2", "rimraf": "2.6.1", - "semver": "5.4.0", - "write-file-atomic": "2.1.0", + "semver": "5.4.1", + "write-file-atomic": "2.3.0", "xml-mapping": "1.7.1" }, "devDependencies": { diff --git a/scripts/vagrantCloudBasedContainers.sh b/scripts/vagrantCloudBasedContainers.sh index 0df8e8fae..d118bddea 100755 --- a/scripts/vagrantCloudBasedContainers.sh +++ b/scripts/vagrantCloudBasedContainers.sh @@ -3,7 +3,7 @@ # This scripts deploys an environment for end-to-end tests based on Docker # containers. It was initially developed to support CI. # -# It builds a Docker image for GPII/universal and uses it to start two +# It builds a Docker image for GPII/universal and uses it to start two # components: the Preferences Server and the Flow Manager. # # It also starts a CouchDB container and loads the Preferences data into @@ -12,7 +12,7 @@ # # This script can be executed multiple times to create a new Docker image # and deploy fresh containers every time. -# +# # https://issues.gpii.net/browse/GPII-2470 UNIVERSAL_IMAGE=vagrant-universal @@ -56,5 +56,4 @@ curl --retry $COUCHDB_HEALTHCHECK_TIMEOUT --retry-delay 1 --retry-connrefused ht docker run -d -p $PREFERENCES_PORT:$PREFERENCES_PORT --name preferences --link couchdb -e NODE_ENV=$PREFERENCES_CONFIG -e GPII_PREFERENCES_DATASOURCE_URL=$PREFERENCES_DATASOURCE_URL -e GPII_PREFERENCES_LISTEN_PORT=$PREFERENCES_PORT $UNIVERSAL_IMAGE docker run -d -p $FLOWMANAGER_PORT:$FLOWMANAGER_PORT --name flowmanager --link preferences -e NODE_ENV=$FLOWMANAGER_CONFIG -e GPII_FLOWMANAGER_PREFERENCES_URL=$FLOWMANAGER_PREFERENCES_URL -e GPII_FLOWMANAGER_LISTEN_PORT=$FLOWMANAGER_PORT $UNIVERSAL_IMAGE -docker run --rm --link couchdb -v $PREFERENCES_DIR:/data -e PREFERENCES_DIR=/data -e COUCHDB_URL=$DATALOADER_COUCHDB_URL -e CLEAR_INDEX=$DATALOADER_CLEAR_INDEX $DATALOADER_IMAGE - +docker run --rm --link couchdb -v $PREFERENCES_DIR:/data -e PREFERENCES_DIR=/data -e COUCHDB_URL=$DATALOADER_COUCHDB_URL -e CLEAR_INDEX=$DATALOADER_CLEAR_INDEX $DATALOADER_IMAGE \ No newline at end of file diff --git a/testData/deviceReporter/acceptanceTests/chrome.json b/testData/deviceReporter/acceptanceTests/chrome.json deleted file mode 100644 index 341faafcd..000000000 --- a/testData/deviceReporter/acceptanceTests/chrome.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - { - "id": "com.ilunion.cloud4chrome" - } -] diff --git a/testData/deviceReporter/acceptanceTests/uioPlus.json b/testData/deviceReporter/acceptanceTests/uioPlus.json new file mode 100644 index 000000000..30658cff6 --- /dev/null +++ b/testData/deviceReporter/acceptanceTests/uioPlus.json @@ -0,0 +1,5 @@ +[ + { + "id": "net.gpii.uioPlus" + } +] diff --git a/testData/ontologies/mappings/ISO24751-flat.json5 b/testData/ontologies/mappings/ISO24751-flat.json5 index 0b9b06891..6ad1644c5 100644 --- a/testData/ontologies/mappings/ISO24751-flat.json5 +++ b/testData/ontologies/mappings/ISO24751-flat.json5 @@ -1,7 +1,11 @@ { "http://registry\\.gpii\\.net/common/fontSize": "display.screenEnhancement.fontSize", + "http://registry\\.gpii\\.net/common/lineSpace": "display.screenEnhancement.-provisional-lineSpace", + "http://registry\\.gpii\\.net/common/characterSpace": "display.screenEnhancement.-provisional-characterSpace", + "http://registry\\.gpii\\.net/common/inputsLargerEnabled": "display.screenEnhancement.-provisional-inputsLargerEnabled", "http://registry\\.gpii\\.net/common/foregroundColor": "display.screenEnhancement.foregroundColor", "http://registry\\.gpii\\.net/common/backgroundColor": "display.screenEnhancement.backgroundColor", + "http://registry\\.gpii\\.net/common/highlightColor": "display.screenEnhancement.highlightColor", "http://registry\\.gpii\\.net/common/fontFaceFontName": "display.screenEnhancement.fontFaceFontName", "http://registry\\.gpii\\.net/common/fontFaceGenericFontFace": "display.screenEnhancement.fontFaceGenericFontFace", "http://registry\\.gpii\\.net/common/magnifierEnabled": "display.screenEnhancement.-provisional-magnifierEnabled", @@ -40,12 +44,15 @@ "http://registry\\.gpii\\.net/common/mouseEmulationEnabled": "control.mouseEmulation.-provisional-mouseEmulationEnabled", "http://registry\\.gpii\\.net/common/stickyKeys": "control.keyboardEnhancement.stickyKeys", "http://registry\\.gpii\\.net/common/slowKeysInterval": "control.keyboardEnhancement.slowKeys.slowKeysInterval", - "http://registry\\.gpii\\.net/common/slowKeysEnable": "control.keyboardEnhancement.slowKeys.-provisional-slowKeysEnable", - "http://registry\\.gpii\\.net/common/debounceEnable": "control.keyboardEnhancement.debounceKeys.-provisional-debounceEnable", + "http://registry\\.gpii\\.net/common/slowKeysEnabled": "control.keyboardEnhancement.slowKeys.-provisional-slowKeysEnabled", + "http://registry\\.gpii\\.net/common/debounceEnabled": "control.keyboardEnhancement.debounceKeys.-provisional-debounceEnabled", "http://registry\\.gpii\\.net/common/debounceInterval": "control.keyboardEnhancement.debounceKeys.debounceInterval", "http://registry\\.gpii\\.net/common/hapticFeedback": "control.-provisional-hapticFeedback", - "http://registry\\.gpii\\.net/common/adaptationPreference": "content.adaptationPreference", "http://registry\\.gpii\\.net/common/tableOfContents": "control.structuralNavigation.tableOfContents", + "http://registry\\.gpii\\.net/common/adaptationPreference": "content.adaptationPreference", + "http://registry\\.gpii\\.net/common/supportTool": "content.supportTool", + "http://registry\\.gpii\\.net/common/simplifiedUiEnabled": "-provisional-cognitiveSupport.-provisional-simplifiedUiEnabled", + "http://registry\\.gpii\\.net/common/syllabificationEnabled": "-provisional-cognitiveSupport.-provisional-syllabificationEnabled", "http://registry\\.gpii\\.net/common/volume": "-provisional-general.-provisional-volume", "http://registry\\.gpii\\.net/common/language": "language", "": { diff --git a/testData/ontologies/mappings/flat-apptology.json5 b/testData/ontologies/mappings/flat-apptology.json5 index c06c20548..7e0c1a6b3 100644 --- a/testData/ontologies/mappings/flat-apptology.json5 +++ b/testData/ontologies/mappings/flat-apptology.json5 @@ -12,7 +12,7 @@ ], "http://registry\\.gpii\\.net/common/screenReaderApplication": "http://registry\\.gpii\\.net/common/screenReaderTTSEnabled", "http://registry\\.gpii\\.net/common/stickyKeysApplication": "http://registry\\.gpii\\.net/common/stickyKeys", - "http://registry\\.gpii\\.net/common/slowKeysApplication": "http://registry\\.gpii\\.net/common/slowKeysEnable", - "http://registry\\.gpii\\.net/common/debounceKeysApplication": "http://registry\\.gpii\\.net/common/debounceEnable", + "http://registry\\.gpii\\.net/common/slowKeysApplication": "http://registry\\.gpii\\.net/common/slowKeysEnabled", + "http://registry\\.gpii\\.net/common/debounceKeysApplication": "http://registry\\.gpii\\.net/common/debounceEnabled", "http://registry\\.gpii\\.net/common/onScreenKeyboardApplication": "http://registry\\.gpii\\.net/common/onScreenKeyboardEnabled" } \ No newline at end of file diff --git a/testData/preferences/MikelVargas.json b/testData/preferences/MikelVargas.json index 68ba124f2..6805d1e6f 100644 --- a/testData/preferences/MikelVargas.json +++ b/testData/preferences/MikelVargas.json @@ -10,9 +10,9 @@ "http://registry.gpii.net/common/cursorAcceleration": 0.800, "http://registry.gpii.net/common/mouseEmulationEnabled": true, "http://registry.gpii.net/common/stickyKeys": true, - "http://registry.gpii.net/common/slowKeysEnable": true, + "http://registry.gpii.net/common/slowKeysEnabled": true, "http://registry.gpii.net/common/slowKeysInterval": 0.4, - "http://registry.gpii.net/common/debounceEnable": true, + "http://registry.gpii.net/common/debounceEnabled": true, "http://registry.gpii.net/common/debounceInterval": 0.20 } } diff --git a/testData/preferences/acceptanceTests/chrome_high_contrast.json b/testData/preferences/acceptanceTests/chrome_high_contrast.json index e81e8e981..69ddcbe38 100644 --- a/testData/preferences/acceptanceTests/chrome_high_contrast.json +++ b/testData/preferences/acceptanceTests/chrome_high_contrast.json @@ -4,15 +4,15 @@ "gpii-default": { "name": "Default preferences", "preferences": { - "http://registry.gpii.net/common/fontSize": 12, - "http://registry.gpii.net/common/screenReaderTTSEnabled": false, - "http://registry.gpii.net/common/magnifierEnabled": false, - "http://registry.gpii.net/common/magnification": 1, - "http://registry.gpii.net/common/highContrastEnabled": true, - "http://registry.gpii.net/common/highContrastTheme": "white-black", - "http://registry.gpii.net/common/invertColours": false + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/screenReaderTTSEnabled": false, + "http://registry.gpii.net/common/magnifierEnabled": false, + "http://registry.gpii.net/common/magnification": 1, + "http://registry.gpii.net/common/highContrastEnabled": true, + "http://registry.gpii.net/common/highContrastTheme": "white-black", + "http://registry.gpii.net/common/invertColours": false } } } } -} \ No newline at end of file +} diff --git a/testData/preferences/acceptanceTests/fm_gnome_keyboard.json b/testData/preferences/acceptanceTests/fm_gnome_keyboard.json index 68ba124f2..6805d1e6f 100644 --- a/testData/preferences/acceptanceTests/fm_gnome_keyboard.json +++ b/testData/preferences/acceptanceTests/fm_gnome_keyboard.json @@ -10,9 +10,9 @@ "http://registry.gpii.net/common/cursorAcceleration": 0.800, "http://registry.gpii.net/common/mouseEmulationEnabled": true, "http://registry.gpii.net/common/stickyKeys": true, - "http://registry.gpii.net/common/slowKeysEnable": true, + "http://registry.gpii.net/common/slowKeysEnabled": true, "http://registry.gpii.net/common/slowKeysInterval": 0.4, - "http://registry.gpii.net/common/debounceEnable": true, + "http://registry.gpii.net/common/debounceEnabled": true, "http://registry.gpii.net/common/debounceInterval": 0.20 } } diff --git a/testData/preferences/acceptanceTests/giant.json b/testData/preferences/acceptanceTests/giant.json new file mode 100644 index 000000000..e2028007c --- /dev/null +++ b/testData/preferences/acceptanceTests/giant.json @@ -0,0 +1,14 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/giantTesting": { + "key1": "fdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljkfdasljkadsfkljadsflkjadfslklkjdsfljkdfsakjlfdsajklfdsakljfdasljk" + } + } + } + } + } +} \ No newline at end of file diff --git a/testData/preferences/acceptanceTests/os_common.json b/testData/preferences/acceptanceTests/os_common.json index f2051074c..ce069a2cc 100644 --- a/testData/preferences/acceptanceTests/os_common.json +++ b/testData/preferences/acceptanceTests/os_common.json @@ -16,7 +16,7 @@ "http://registry.gpii.net/common/cursorAcceleration": 1, "http://registry.gpii.net/common/cursorSpeed": 1, "http://registry.gpii.net/common/stickyKeys": true, - "http://registry.gpii.net/common/debounceEnable": true, + "http://registry.gpii.net/common/debounceEnabled": true, "http://registry.gpii.net/common/debounceInterval": 1 } } diff --git a/testData/preferences/acceptanceTests/uioPlus_character_space.json b/testData/preferences/acceptanceTests/uioPlus_character_space.json new file mode 100644 index 000000000..2b54a94a7 --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_character_space.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 1, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_defaults.json b/testData/preferences/acceptanceTests/uioPlus_defaults.json new file mode 100644 index 000000000..e7e4d2b69 --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_defaults.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_font_size.json b/testData/preferences/acceptanceTests/uioPlus_font_size.json new file mode 100644 index 000000000..9356f7cf3 --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_font_size.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 24, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_high_contrast.json b/testData/preferences/acceptanceTests/uioPlus_high_contrast.json new file mode 100644 index 000000000..3e229da55 --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_high_contrast.json @@ -0,0 +1,23 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": true, + "http://registry.gpii.net/common/highContrastTheme": "white-black", + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_highlight_colour.json b/testData/preferences/acceptanceTests/uioPlus_highlight_colour.json new file mode 100644 index 000000000..677c28e92 --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_highlight_colour.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "yellow", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_inputs_larger.json b/testData/preferences/acceptanceTests/uioPlus_inputs_larger.json new file mode 100644 index 000000000..f08c1dab1 --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_inputs_larger.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": true, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_line_space.json b/testData/preferences/acceptanceTests/uioPlus_line_space.json new file mode 100644 index 000000000..1e7edb6b0 --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_line_space.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 2, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_multiple_settings.json b/testData/preferences/acceptanceTests/uioPlus_multiple_settings.json new file mode 100644 index 000000000..ee3406cb3 --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_multiple_settings.json @@ -0,0 +1,23 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1.3, + "http://registry.gpii.net/common/fontSize": 16, + "http://registry.gpii.net/common/characterSpace": 2, + "http://registry.gpii.net/common/selfVoicingEnabled": true, + "http://registry.gpii.net/common/inputsLargerEnabled": true, + "http://registry.gpii.net/common/highContrastEnabled": true, + "http://registry.gpii.net/common/highContrastTheme": "yellow-black", + "http://registry.gpii.net/common/highlightColor": "green", + "http://registry.gpii.net/common/tableOfContents": true, + "http://registry.gpii.net/common/supportTool": ["dictionary"], + "http://registry.gpii.net/common/simplifiedUiEnabled": true, + "http://registry.gpii.net/common/syllabificationEnabled": true + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_multiple_support_tool.json b/testData/preferences/acceptanceTests/uioPlus_multiple_support_tool.json new file mode 100644 index 000000000..80d345cb4 --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_multiple_support_tool.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": ["dictionary", "thesaurus"], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_self_voicing.json b/testData/preferences/acceptanceTests/uioPlus_self_voicing.json new file mode 100644 index 000000000..707aad3e9 --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_self_voicing.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": true, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_simplified.json b/testData/preferences/acceptanceTests/uioPlus_simplified.json new file mode 100644 index 000000000..c1c11cc6f --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_simplified.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": true, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_support_tool.json b/testData/preferences/acceptanceTests/uioPlus_support_tool.json new file mode 100644 index 000000000..048cc213f --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_support_tool.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": ["dictionary"], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_syllabification.json b/testData/preferences/acceptanceTests/uioPlus_syllabification.json new file mode 100644 index 000000000..edd27c201 --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_syllabification.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": true + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_toc.json b/testData/preferences/acceptanceTests/uioPlus_toc.json new file mode 100644 index 000000000..73fbbbd96 --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_toc.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": true, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/acceptanceTests/uioPlus_unhandled_support_tool.json b/testData/preferences/acceptanceTests/uioPlus_unhandled_support_tool.json new file mode 100644 index 000000000..2d457ce62 --- /dev/null +++ b/testData/preferences/acceptanceTests/uioPlus_unhandled_support_tool.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": ["thesaurus"], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/chrome1.json b/testData/preferences/chrome1.json deleted file mode 100644 index e7436e858..000000000 --- a/testData/preferences/chrome1.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "flat": { - "contexts": { - "gpii-default": { - "name": "Default preferences", - "preferences": { - "http://registry.gpii.net/applications/com.ilunion.cloud4chrome": { - "screenReaderTTSEnabled": true, - "simplifier": true - } - } - } - } - } -} \ No newline at end of file diff --git a/testData/preferences/chrome2.json b/testData/preferences/chrome2.json deleted file mode 100644 index 3f2ff276b..000000000 --- a/testData/preferences/chrome2.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "flat": { - "contexts": { - "gpii-default": { - "name": "Default preferences", - "preferences": { - "http://registry.gpii.net/applications/com.ilunion.cloud4chrome": { - "screenReaderTTSEnabled": false, - "highContrastEnabled": true, - "invertColours": false, - "magnifierEnabled": true, - "magnification": 2, - "fontSize": "medium", - "simplifier": false, - "highContrastTheme": "white-black" - } - } - } - } - } -} \ No newline at end of file diff --git a/testData/preferences/chromeCommon.json b/testData/preferences/chromeCommon.json deleted file mode 100644 index 882bab474..000000000 --- a/testData/preferences/chromeCommon.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "flat": { - "contexts": { - "gpii-default": { - "name": "Default preferences", - "preferences": { - "http://registry.gpii.net/common/fontSize": 12, - "http://registry.gpii.net/common/screenReaderTTSEnabled": false, - "http://registry.gpii.net/common/magnifierEnabled": false, - "http://registry.gpii.net/common/magnification": 2, - "http://registry.gpii.net/common/highContrastEnabled": true, - "http://registry.gpii.net/common/highContrastTheme":[{"value":"white-black"}], - "http://registry.gpii.net/common/invertColours": false - } - } - } - } -} \ No newline at end of file diff --git a/testData/preferences/uioPlusCommon.json b/testData/preferences/uioPlusCommon.json new file mode 100644 index 000000000..55e78176a --- /dev/null +++ b/testData/preferences/uioPlusCommon.json @@ -0,0 +1,23 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 2, + "http://registry.gpii.net/common/fontSize": 24, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": true, + "http://registry.gpii.net/common/inputsLargerEnabled": true, + "http://registry.gpii.net/common/highContrastEnabled": true, + "http://registry.gpii.net/common/highContrastTheme": "white-black", + "http://registry.gpii.net/common/highlightColor": "green", + "http://registry.gpii.net/common/tableOfContents": true, + "http://registry.gpii.net/common/supportTool": ["dictionary"], + "http://registry.gpii.net/common/simplifiedUiEnabled": true, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlusCommon.md b/testData/preferences/uioPlusCommon.md new file mode 100644 index 000000000..1c4e7d730 --- /dev/null +++ b/testData/preferences/uioPlusCommon.md @@ -0,0 +1,18 @@ +# uioPlusCommon + +A preference set for testing preference settings in the UIO+ browser extension. + +Attempts to set all of the UIO+ supported preferences. + +## Preferences + +* Line Space: doubled (2) +* Font Size: doubled (2) +* Self Voicing: enabled +* Inputs Larger: enabled (form controls increase in size) +* High Contrast: Enabled +* High Contrast Theme: white-black +* Highlight Color: green (text selection is highlighted in green) +* Table of Contents: enabled +* Dictionary: enabled (requires page reload) +* Simplified UI: enabled diff --git a/testData/preferences/uioPlus_character_space.json b/testData/preferences/uioPlus_character_space.json new file mode 100644 index 000000000..2b54a94a7 --- /dev/null +++ b/testData/preferences/uioPlus_character_space.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 1, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlus_character_space.md b/testData/preferences/uioPlus_character_space.md new file mode 100644 index 000000000..99f84a1e7 --- /dev/null +++ b/testData/preferences/uioPlus_character_space.md @@ -0,0 +1,5 @@ +# uioPlus_character_space + +A preference set for testing preference settings in the UIO+ browser extension. + +While the Character Space preference is set, there is currently no adjuster or enactor that supports this preference. No change will be reflected in UIO+ panel or the site. diff --git a/testData/preferences/uioPlus_defaults.json b/testData/preferences/uioPlus_defaults.json new file mode 100644 index 000000000..e7e4d2b69 --- /dev/null +++ b/testData/preferences/uioPlus_defaults.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlus_defaults.md b/testData/preferences/uioPlus_defaults.md new file mode 100644 index 000000000..a3b3dd768 --- /dev/null +++ b/testData/preferences/uioPlus_defaults.md @@ -0,0 +1,5 @@ +# uioPlus_defaults + +A preference set for testing preference settings in the UIO+ browser extension. + +Uses only the default settings, which should have no affect on UIO+. diff --git a/testData/preferences/uioPlus_font_size.json b/testData/preferences/uioPlus_font_size.json new file mode 100644 index 000000000..9356f7cf3 --- /dev/null +++ b/testData/preferences/uioPlus_font_size.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 24, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlus_font_size.md b/testData/preferences/uioPlus_font_size.md new file mode 100644 index 000000000..1bdee6898 --- /dev/null +++ b/testData/preferences/uioPlus_font_size.md @@ -0,0 +1,5 @@ +# uioPlus_font_size + +A preference set for testing preference settings in the UIO+ browser extension. + +Applies the Font Size preference. The text should increase in size. diff --git a/testData/preferences/uioPlus_high_contrast.json b/testData/preferences/uioPlus_high_contrast.json new file mode 100644 index 000000000..3e229da55 --- /dev/null +++ b/testData/preferences/uioPlus_high_contrast.json @@ -0,0 +1,23 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": true, + "http://registry.gpii.net/common/highContrastTheme": "white-black", + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlus_high_contrast.md b/testData/preferences/uioPlus_high_contrast.md new file mode 100644 index 000000000..4ba2ccc56 --- /dev/null +++ b/testData/preferences/uioPlus_high_contrast.md @@ -0,0 +1,5 @@ +# uioPlus_high_contrast + +A preference set for testing preference settings in the UIO+ browser extension. + +Applies the Highlight Contrast theme preference. The contrast of the page will be set to match the specified contrast theme. Unless a site provides it's own themed versions (most likely only pages that already support UIO), images will remain unaffected. diff --git a/testData/preferences/uioPlus_highlight_colour.json b/testData/preferences/uioPlus_highlight_colour.json new file mode 100644 index 000000000..677c28e92 --- /dev/null +++ b/testData/preferences/uioPlus_highlight_colour.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "yellow", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlus_highlight_colour.md b/testData/preferences/uioPlus_highlight_colour.md new file mode 100644 index 000000000..9053636b6 --- /dev/null +++ b/testData/preferences/uioPlus_highlight_colour.md @@ -0,0 +1,5 @@ +# uioPlus_highlight_colour + +A preference set for testing preference settings in the UIO+ browser extension. + +Applies the Highlight Colour preference. The colour of the text selection highlight will be changed to match the preference. diff --git a/testData/preferences/uioPlus_inputs_larger.json b/testData/preferences/uioPlus_inputs_larger.json new file mode 100644 index 000000000..f08c1dab1 --- /dev/null +++ b/testData/preferences/uioPlus_inputs_larger.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": true, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlus_inputs_larger.md b/testData/preferences/uioPlus_inputs_larger.md new file mode 100644 index 000000000..e63f6ca28 --- /dev/null +++ b/testData/preferences/uioPlus_inputs_larger.md @@ -0,0 +1,5 @@ +# uioPlus_inputs_larger + +A preference set for testing preference settings in the UIO+ browser extension. + +Applies the Inputs Larger preference. Form controls should increase in size. diff --git a/testData/preferences/uioPlus_line_space.json b/testData/preferences/uioPlus_line_space.json new file mode 100644 index 000000000..1e7edb6b0 --- /dev/null +++ b/testData/preferences/uioPlus_line_space.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 2, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlus_line_space.md b/testData/preferences/uioPlus_line_space.md new file mode 100644 index 000000000..96a082a63 --- /dev/null +++ b/testData/preferences/uioPlus_line_space.md @@ -0,0 +1,5 @@ +# uioPlus_line_space + +A preference set for testing preference settings in the UIO+ browser extension. + +Applies the Line Space preference. The line space should increase in size. diff --git a/testData/preferences/uioPlus_multiple_settings.json b/testData/preferences/uioPlus_multiple_settings.json new file mode 100644 index 000000000..ee3406cb3 --- /dev/null +++ b/testData/preferences/uioPlus_multiple_settings.json @@ -0,0 +1,23 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1.3, + "http://registry.gpii.net/common/fontSize": 16, + "http://registry.gpii.net/common/characterSpace": 2, + "http://registry.gpii.net/common/selfVoicingEnabled": true, + "http://registry.gpii.net/common/inputsLargerEnabled": true, + "http://registry.gpii.net/common/highContrastEnabled": true, + "http://registry.gpii.net/common/highContrastTheme": "yellow-black", + "http://registry.gpii.net/common/highlightColor": "green", + "http://registry.gpii.net/common/tableOfContents": true, + "http://registry.gpii.net/common/supportTool": ["dictionary"], + "http://registry.gpii.net/common/simplifiedUiEnabled": true, + "http://registry.gpii.net/common/syllabificationEnabled": true + } + } + } + } +} diff --git a/testData/preferences/uioPlus_multiple_settings.md b/testData/preferences/uioPlus_multiple_settings.md new file mode 100644 index 000000000..e09c37337 --- /dev/null +++ b/testData/preferences/uioPlus_multiple_settings.md @@ -0,0 +1,20 @@ +# uioPlus_multiple_settings + +A preference set for testing preference settings in the UIO+ browser extension. + +Attempts to set all of the UIO+ preferences. The Syllabification and CharacterSpace preferences are currently not supported by UIO+ and will be ignored. + +## Preferences + +* Line Space: increased (1.3) +* Font Size: increased (1.3) +* Character Space: increased (2) +* Self Voicing: enabled +* Inputs Larger: enabled (form controls increase in size) +* High Contrast: Enabled +* High Contrast Theme: yellow-black +* Highlight Color: green (text selection is highlighted in green) +* Table of Contents: enabled +* Dictionary: enabled (requires page reload) +* Simplified UI: enabled +* Syllabification: enabled diff --git a/testData/preferences/uioPlus_multiple_support_tool.json b/testData/preferences/uioPlus_multiple_support_tool.json new file mode 100644 index 000000000..80d345cb4 --- /dev/null +++ b/testData/preferences/uioPlus_multiple_support_tool.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": ["dictionary", "thesaurus"], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlus_multiple_support_tool.md b/testData/preferences/uioPlus_multiple_support_tool.md new file mode 100644 index 000000000..6d9e819c9 --- /dev/null +++ b/testData/preferences/uioPlus_multiple_support_tool.md @@ -0,0 +1,5 @@ +# uioPlus_multiple_support_tool + +A preference set for testing preference settings in the UIO+ browser extension. + +Enables the Dictionary preference. The Google Dictionary browser extension should be enabled. Any open pages/tabs will need to be reloaded before the Google Dictionary extension will work on a page. The "thesaurus" supportTool is not supported and will be ignored. diff --git a/testData/preferences/uioPlus_self_voicing.json b/testData/preferences/uioPlus_self_voicing.json new file mode 100644 index 000000000..707aad3e9 --- /dev/null +++ b/testData/preferences/uioPlus_self_voicing.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": true, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlus_self_voicing.md b/testData/preferences/uioPlus_self_voicing.md new file mode 100644 index 000000000..9f7a126d2 --- /dev/null +++ b/testData/preferences/uioPlus_self_voicing.md @@ -0,0 +1,5 @@ +# uioPlus_self_voicing + +A preference set for testing preference settings in the UIO+ browser extension. + +Enables the Self Voicing preference. The click2speech browser extension should be enabled. diff --git a/testData/preferences/uioPlus_simplified.json b/testData/preferences/uioPlus_simplified.json new file mode 100644 index 000000000..c1c11cc6f --- /dev/null +++ b/testData/preferences/uioPlus_simplified.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": true, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlus_simplified.md b/testData/preferences/uioPlus_simplified.md new file mode 100644 index 000000000..d966930ad --- /dev/null +++ b/testData/preferences/uioPlus_simplified.md @@ -0,0 +1,5 @@ +# uioPlus_simplified + +A preference set for testing preference settings in the UIO+ browser extension. + +Enables the Simplified UI preference. For pages where main content can be identified, only the portions of the page that reside within the main content will be visible. If main content cannot be identified, the page will remain unchanged. diff --git a/testData/preferences/uioPlus_support_tool.json b/testData/preferences/uioPlus_support_tool.json new file mode 100644 index 000000000..048cc213f --- /dev/null +++ b/testData/preferences/uioPlus_support_tool.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": ["dictionary"], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlus_support_tool.md b/testData/preferences/uioPlus_support_tool.md new file mode 100644 index 000000000..1e6b9a3df --- /dev/null +++ b/testData/preferences/uioPlus_support_tool.md @@ -0,0 +1,5 @@ +# uioPlus_support_tool + +A preference set for testing preference settings in the UIO+ browser extension. + +Enables the Dictionary preference. The Google Dictionary browser extension should be enabled. Any open pages/tabs will need to be reloaded before the Google Dictionary extension will work on a page. diff --git a/testData/preferences/uioPlus_syllabification.json b/testData/preferences/uioPlus_syllabification.json new file mode 100644 index 000000000..edd27c201 --- /dev/null +++ b/testData/preferences/uioPlus_syllabification.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": true + } + } + } + } +} diff --git a/testData/preferences/uioPlus_syllabification.md b/testData/preferences/uioPlus_syllabification.md new file mode 100644 index 000000000..fe22ff0c6 --- /dev/null +++ b/testData/preferences/uioPlus_syllabification.md @@ -0,0 +1,5 @@ +# uioPlus_syllabification + +A preference set for testing preference settings in the UIO+ browser extension. + +While the Syllabification preference is set, there is currently no adjuster or enactor that supports this preference. No change will be reflected in UIO+ panel or the site. diff --git a/testData/preferences/uioPlus_toc.json b/testData/preferences/uioPlus_toc.json new file mode 100644 index 000000000..73fbbbd96 --- /dev/null +++ b/testData/preferences/uioPlus_toc.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": true, + "http://registry.gpii.net/common/supportTool": [], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlus_toc.md b/testData/preferences/uioPlus_toc.md new file mode 100644 index 000000000..d31974010 --- /dev/null +++ b/testData/preferences/uioPlus_toc.md @@ -0,0 +1,5 @@ +# uioPlus_toc + +A preference set for testing preference settings in the UIO+ browser extension. + +Should only enable the Table of Contents. The table of contents will be injected into one of the following locations depending on what is located on the page: an element with the class `flc-toc-tocContainer`, main content, or the `body` element. diff --git a/testData/preferences/uioPlus_unhandled_support_tool.json b/testData/preferences/uioPlus_unhandled_support_tool.json new file mode 100644 index 000000000..2d457ce62 --- /dev/null +++ b/testData/preferences/uioPlus_unhandled_support_tool.json @@ -0,0 +1,22 @@ +{ + "flat": { + "contexts": { + "gpii-default": { + "name": "Default preferences", + "preferences": { + "http://registry.gpii.net/common/lineSpace": 1, + "http://registry.gpii.net/common/fontSize": 12, + "http://registry.gpii.net/common/characterSpace": 0, + "http://registry.gpii.net/common/selfVoicingEnabled": false, + "http://registry.gpii.net/common/inputsLargerEnabled": false, + "http://registry.gpii.net/common/highContrastEnabled": false, + "http://registry.gpii.net/common/highlightColor": "default", + "http://registry.gpii.net/common/tableOfContents": false, + "http://registry.gpii.net/common/supportTool": ["thesaurus"], + "http://registry.gpii.net/common/simplifiedUiEnabled": false, + "http://registry.gpii.net/common/syllabificationEnabled": false + } + } + } + } +} diff --git a/testData/preferences/uioPlus_unhandled_support_tool.md b/testData/preferences/uioPlus_unhandled_support_tool.md new file mode 100644 index 000000000..0e194afc1 --- /dev/null +++ b/testData/preferences/uioPlus_unhandled_support_tool.md @@ -0,0 +1,5 @@ +# uioPlus_unhandled_support_tool + +A preference set for testing preference settings in the UIO+ browser extension. + +This particular preference set should make no changes, as it attempts to add a support tool (Thesaurus) that is not supported by UIO+. diff --git a/testData/processReporter/runningSolutions.json b/testData/processReporter/runningSolutions.json new file mode 100644 index 000000000..8abfd8459 --- /dev/null +++ b/testData/processReporter/runningSolutions.json @@ -0,0 +1,172 @@ +[ + { + "id": "org.gnome.desktop.interface", + "runnning": true + }, + + { + "id": "org.gnome.shell.overrides", + "runnning": true + }, + + { + "id": "org.gnome.desktop.wm.preferences", + "runnning": true + }, + + { + "id": "org.gnome.nautilus", + "runnning": true + }, + + { + "id": "org.gnome.desktop.a11y.keyboard", + "runnning": true + }, + + { + "id": "org.gnome.desktop.a11y.applications.onscreen-keyboard", + "runnning": true + }, + + { + "id": "org.gnome.orca", + "runnning": true + }, + + { + "id": "org.gnome.desktop.a11y.magnifier", + "runnning": true + }, + + { + "id": "com.microsoft.windows.magnifier", + "runnning": true + }, + + { + "id": "com.microsoft.windows.onscreenKeyboard", + "runnning": true + }, + + { + "id": "org.nvda-project", + "runnning": true + }, + + { + "id": "org.gnome.desktop.interface", + "runnning": true + }, + + { + "id": "org.gnome.nautilus", + "runnning": true + }, + + { + "id": "trace.easyOne.communicator.windows", + "runnning": true + }, + + { + "id": "trace.easyOne.communicator.linux", + "runnning": true + }, + + { + "id": "trace.easyOne.sudan.windows", + "runnning": true + }, + + { + "id": "trace.easyOne.sudan.linux", + "runnning": true + }, + + { + "id": "webinsight.webAnywhere.windows", + "runnning": true + }, + + { + "id": "webinsight.webAnywhere.linux", + "runnning": true + }, + + { + "id": "com.texthelp.readWriteGold", + "runnning": true + }, + + { + "id": "net.opendirective.maavis", + "runnning": true + }, + + { + "id": "com.microsoft.windows.highContrast", + "runnning": true + }, + + { + "id": "com.microsoft.windows.mouseTrailing", + "runnning": true + }, + + { + "id": "com.microsoft.windows.cursors", + "runnning": true + }, + + { + "id": "com.android.activitymanager", + "runnning": true + }, + + { + "id": "com.android.talkback", + "runnning": true + }, + + { + "id": "com.android.freespeech", + "runnning": true + }, + + { + "id": "org.chrome.cloud4chrome", + "runnning": true + }, + + { + "id": "com.android.settings.secure", + "runnning": true + }, + + { + "id": "com.android.audioManager", + "runnning": true + }, + + { + "id": "com.android.persistentConfiguration", + "runnning": true + }, + + { + "id": "org.alsa-project", + "runnning": true + }, + + { + "id": "org.freedesktop.xrandr", + "runnning": true + }, + + { + "id": "com.android.settings.system", + "runnning": true + } + +] diff --git a/testData/solutions/linux.json5 b/testData/solutions/linux.json5 index a2bd3b4b8..8ebddaff6 100644 --- a/testData/solutions/linux.json5 +++ b/testData/solutions/linux.json5 @@ -103,6 +103,18 @@ "type": "gpii.packageKit.find", "name": "gnome-shell" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "gnome-shell" + }, + { + "type": "gpii.processReporter.checkSetting", + "schema": "org.gnome.desktop.a11y.applications", + "setting": "screen-magnifier-enabled", + "value": true + } ] }, @@ -219,6 +231,12 @@ "type": "gpii.packageKit.find", "name": "gsettings-desktop-schemas" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "dunno" + } ] }, @@ -255,6 +273,12 @@ "type": "gpii.packageKit.find", "name": "nautilus" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "nautilus" + } ] }, @@ -291,6 +315,12 @@ "type": "gpii.packageKit.find", "name": "gnome-shell" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "caribou" + } ] }, @@ -308,7 +338,7 @@ "capabilities": [], "capabilitiesTransformations": { "stickykeys-enable": "http://registry\\.gpii\\.net/common/stickyKeys", - "slowkeys-enable": "http://registry\\.gpii\\.net/common/slowKeysEnable", + "slowkeys-enable": "http://registry\\.gpii\\.net/common/slowKeysEnabled", "slowkeys-delay": { "transform": { "type": "fluid.transforms.linearScale", @@ -316,7 +346,7 @@ "factor": 1000 } }, - "bouncekeys-enable": "http://registry\\.gpii\\.net/common/debounceEnable", + "bouncekeys-enable": "http://registry\\.gpii\\.net/common/debounceEnabled", "bouncekeys-delay": { "transform": { "type": "fluid.transforms.linearScale", @@ -363,6 +393,12 @@ "type": "gpii.packageKit.find", "name": "gsettings-desktop-schemas" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "gnome-settings-daemon" + } ] }, @@ -1069,6 +1105,12 @@ "type": "gpii.packageKit.find", "name": "orca" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "orca" + } ] }, @@ -1115,6 +1157,12 @@ "type": "gpii.packageKit.find", "name": "alsa-lib" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "alsactl" + } ] }, @@ -1161,6 +1209,12 @@ "type": "gpii.packageKit.find", "name": "google-chrome-unstable" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "chrome" + } ] }, @@ -1207,6 +1261,12 @@ "type": "gpii.packageKit.find", "name": "google-chrome-unstable" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "chrome" + } ] }, @@ -1253,6 +1313,12 @@ "type": "gpii.packageKit.find", "name": "google-chrome-unstable" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "chrome" + } ] }, @@ -1284,81 +1350,111 @@ ] }, - "com.ilunion.cloud4chrome": { - "name": "Cloud4all Chrome extension", + "net.gpii.uioPlus": { + "name": "UIO+ Browser Extension", "contexts": { "OS": [{ - "id": "linux", - "version": ">=2.6.26" + "id": "win32", + "version": ">=5.0" }] }, "settingsHandlers": { - "chromeconf": { + "configuration": { "type": "gpii.settingsHandlers.webSockets", "options": { - "path": "com.ilunion.cloud4chrome" + "path": "net.gpii.uioPlus" }, - "capabilities": [], + "capabilities": [ + "http://registry\\.gpii\\.net/common/lineSpace", + "http://registry\\.gpii\\.net/common/fontSize", + "http://registry\\.gpii\\.net/common/characterSpace", + "http://registry\\.gpii\\.net/common/inputsLargerEnabled", + "http://registry\\.gpii\\.net/common/highContrastEnabled", + "http://registry\\.gpii\\.net/common/highContrastTheme", + "http://registry\\.gpii\\.net/common/selfVoicingEnabled", + "http://registry\\.gpii\\.net/common/highlightColor", + "http://registry\\.gpii\\.net/common/tableOfContents", + "http://registry\\.gpii\\.net/common/supportTool", + "http://registry\\.gpii\\.net/common/simplifiedUiEnabled" + ], "capabilitiesTransformations": { - "screenReaderTTSEnabled": "http://registry\\.gpii\\.net/common/screenReaderTTSEnabled", + "lineSpace": "http://registry\\.gpii\\.net/common/lineSpace", "fontSize": { - "transform":{ - "type": "fluid.transforms.quantize", - "inputPath": "http://registry\\.gpii\\.net/common/fontSize", - "input": 9, - "ranges": [ - { - "upperBound": 12, - "output": "medium" - }, - { - "upperBound": 18, - "output": "large" - }, - { - "output": "x-large" + "transform": { + "type": "fluid.transforms.round", + "scale": 1, + "input": { + "transform": { + "type": "fluid.transforms.binaryOp", + "leftPath": "http://registry\\.gpii\\.net/common/fontSize", + "right": 12, + "operator": "/" } - ] + } } }, - "magnifierEnabled": "http://registry\\.gpii\\.net/common/magnifierEnabled", - "magnification": { + "characterSpace": "http://registry\\.gpii\\.net/common/characterSpace", + "inputsLargerEnabled": "http://registry\\.gpii\\.net/common/inputsLargerEnabled", + "contrastTheme": { "transform": { - "type": "fluid.transforms.quantize", - "inputPath": "http://registry\\.gpii\\.net/common/magnification", - "input": 1, - "ranges": [ - { - "upperBound": 1.2, - "output": 1 - }, - { - "upperBound": 2.5, - "output": 2 + "type": "fluid.transforms.condition", + "conditionPath": "http://registry\\.gpii\\.net/common/highContrastEnabled", + "true": { + "transform": { + "type": "fluid.transforms.valueMapper", + "defaultInputPath": "http://registry\\.gpii\\.net/common/highContrastTheme", + "defaultOutputValue": "default", + "match": { + "black-white": "bw", + "white-black": "wb", + "black-yellow": "by", + "yellow-black": "yb" + } + } + }, + "false": "default" + } + }, + "selfVoicingEnabled": "http://registry\\.gpii\\.net/common/selfVoicingEnabled", + "selectionTheme": "http://registry\\.gpii\\.net/common/highlightColor", + "tableOfContents": "http://registry\\.gpii\\.net/common/tableOfContents", + "dictionaryEnabled": { + "transform": { + "type": "fluid.transforms.valueMapper", + "match": [{ + "inputValue": { + "dictionaryEnabled": true }, - { - "output": 3 + "outputValue": true + }], + "noMatch": { + "outputValue": false + }, + "defaultInput": { + "transform": { + "type": "fluid.transforms.arrayToSetMembership", + "inputPath": "http://registry\\.gpii\\.net/common/supportTool", + "options": { + "dictionary": "dictionaryEnabled" + } } - ] + } } }, - "highContrastEnabled": "http://registry\\.gpii\\.net/common/highContrastEnabled", - "highContrastTheme": "http://registry\\.gpii\\.net/common/highContrastTheme", - "invertColours": "http://registry\\.gpii\\.net/common/invertColours" + "simplifiedUiEnabled": "http://registry\\.gpii\\.net/common/simplifiedUiEnabled", + "syllabificationEnabled": "http://registry\\.gpii\\.net/common/syllabificationEnabled" }, "inverseCapabilitiesTransformations": {} } }, "configure": [ - "settings.chromeconf" + "settings.configuration" ], "restore": [ - "settings.chromeconf" - ], - "start": [ - ], - "stop": [ + "settings.configuration" ], + "start": [], + "stop": [], "isInstalled": [ { "type": "gpii.deviceReporter.alwaysInstalled" diff --git a/testData/solutions/solutionsDescription/com_ilunion_cloud4chrome.md b/testData/solutions/solutionsDescription/com_ilunion_cloud4chrome.md deleted file mode 100644 index 788c0193f..000000000 --- a/testData/solutions/solutionsDescription/com_ilunion_cloud4chrome.md +++ /dev/null @@ -1,51 +0,0 @@ -# Cloud4chrome - -## Details - -* __Name__: cloud4chrome -* __Id__: com.ilunion.cloud4chrome -* __Platform__: Tested on MS Windows and GNU/Linux (it should also work on Mac OSX) -* __Contact__: José Antonio Gutiérrez Dueñas - -## Important Note -As described in the JIRA [GPII-2109](https://issues.gpii.net/browse/GPII-2109), due to the limitation of the current matchmaker and the state of the this solution (which is outdated compared to the requirements of APCP), this solution has been set to report as never being installed in the `isInstalled` directive. - -Once [GPII-1998](https://issues.gpii.net/browse/GPII-1998) has been implemented and this solution (addon) has been updated, the `isInstalled` directive should be updated to properly report when this is installed. - -## Description -The cloud4chrome extension for Google Chrome is a component installable in the web browser. This extension establishes a connection with GPII to get the active preferences. These preferences are used, by the extension, to adapt the web browser content, I mean, the web site interfaces. -The cloud4chrome extension can work autonomously, with cloud-based flowManager, or by local flowManager. - -Useful links: - - * [Chrome extensions developer documentation](https://developer.chrome.com/extensions) - * [Source code at github.com](https://github.com/GutiX/chrome4cloud) - -## Integration -To install the chrome extension, make the following steps. - - * Download the zip file from https://github.com/GutiX/chrome4cloud/archive/master.zip - * Extract the zip file in a folder of your choice - * In the Chrome browser, click on the ‘settings’ icon in the upper right corner. - * Once in the ‘settings’ page, go to ‘extensions’ in the left sidebar menu - * Make sure the ‘Developer mode’ checkbox is checked - * Then, click on ‘Load unpacked extension...’ - ** Select the folder where you unzipped the files you downloaded in step 2 - - -## Testing -When using a NP set that makes use of the cloud4chrome extension, the Chrome browser should be launched and configured properly by taking into account the settings included in that NP set. -Two user profiles with different sets of Needs & Preferences have been provided in order to properly perform the tests. -These user profiles have as follows: - -### Chrome1 -NP set located at universal's testData/preferences/chrome1.json - - * When logging in, Chrome browser should be started automatically and you should listen the screen reader. For this to work, is needed to have installed the Chrome vox extension in the Chrome browser. - * When logging out, default settings will be restored. - -### Chrome2 -NP set located at universal's testData/preferences/chrome2.json - - * When logging in, Chrome browser should be started automatically and you should see the white on black theme and magnification. - * When logging out, default settings will be restored. diff --git a/testData/solutions/solutionsDescription/net_gpii_uioPlus.md b/testData/solutions/solutionsDescription/net_gpii_uioPlus.md new file mode 100644 index 000000000..d9ca4d458 --- /dev/null +++ b/testData/solutions/solutionsDescription/net_gpii_uioPlus.md @@ -0,0 +1,36 @@ +# UIO Plus + +## Details + +* __Name__: browserExtension +* __Id__: net.gpii.uioPlus +* __Platform__: Tested on MS Windows and GNU/Linux (it should also work on Mac OSX) +* __Contact__: Justin Obara + +## Description +The browserExtension extension is a component installable in the web browser, currently only Chrome. This extension establishes a connection with GPII to get the active preferences. These preferences are used, by the extension, to adapt the web content within the browser. + +Useful links: + + * [Chrome extensions developer documentation](https://developer.chrome.com/extensions) + * [Source code at github.com](https://github.com/GPII/gpii-chrome-extension) + +## Installation +To install the extension, make the following steps. + + * Download the zip file from https://github.com/GPII/gpii-chrome-extension/archive/master.zip + * Extract the zip file in a folder of your choice + * In the Chrome browser: + * navigate to chrome://extension + * Make sure the ‘Developer mode’ checkbox is checked + * Click on ‘Load unpacked extension...’ + * Select the folder where you unzipped the files + + +## Testing +For manual testing, please follow the "Installation" steps above. After the browser extension is installed, you can click the "G" extension icon in the browser's chrome to open the UIO+ panel. Changing the settings here should affect the content of the page. Any pages that are opened before the extension is loaded/installed will need to be reloaded before changes will properly apply. + +Another option for manual testing is to login to the GPII with a preference containing preferences supported by the extension. A profile with a set of Needs & Preferences has been provided in order to properly perform the tests. + +### uioPlusCommon +NP set located at universal's testData/preferences/uioPlusCommon.json diff --git a/testData/solutions/win32.json5 b/testData/solutions/win32.json5 index c30aa5587..7f3e9bbf8 100644 --- a/testData/solutions/win32.json5 +++ b/testData/solutions/win32.json5 @@ -589,6 +589,12 @@ "subPath": "", "dataType": "REG_SZ" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "jaws" + } ] }, @@ -644,6 +650,12 @@ "subPath": "InstallPath", "dataType": "REG_SZ" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "readandwrite" + } ] }, @@ -780,6 +792,12 @@ { "type": "gpii.deviceReporter.alwaysInstalled" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "Magnify" + } ] }, @@ -837,6 +855,12 @@ { "type": "gpii.deviceReporter.alwaysInstalled" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "osk" + } ] }, @@ -1518,6 +1542,12 @@ "subPath": "", "dataType": "REG_SZ" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "nvda" + } ] }, @@ -1556,6 +1586,12 @@ { "type": "gpii.deviceReporter.alwaysInstalled" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "firefox" + } ] }, @@ -1593,6 +1629,12 @@ { "type": "gpii.deviceReporter.alwaysInstalled" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "firefox" + } ] }, @@ -1630,6 +1672,12 @@ { "type": "gpii.deviceReporter.alwaysInstalled" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "firefox" + } ] }, @@ -1722,6 +1770,12 @@ { "type": "gpii.deviceReporter.alwaysInstalled" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "MaavisPortable" + } ] }, @@ -1902,9 +1956,9 @@ "FilterKeysEnable": { "transform": { "type": "fluid.transforms.binaryOp", - "leftPath": "http://registry\\.gpii\\.net/common/debounceEnable", + "leftPath": "http://registry\\.gpii\\.net/common/debounceEnabled", "left": false, - "rightPath": "http://registry\\.gpii\\.net/common/slowKeysEnable", + "rightPath": "http://registry\\.gpii\\.net/common/slowKeysEnabled", "right": false, "operator": "||", "outputPath": "value" @@ -1919,7 +1973,7 @@ "SlowKeysInterval": { "transform": { "type": "fluid.transforms.condition", - "conditionPath": "http://registry\\.gpii\\.net/common/slowKeysEnable", + "conditionPath": "http://registry\\.gpii\\.net/common/slowKeysEnabled", "true": { "transform": { "type": "fluid.transforms.linearScale", @@ -1943,7 +1997,7 @@ "condition": { "transform": { "type": "fluid.transforms.binaryOp", - "leftPath": "http://registry\\.gpii\\.net/common/slowKeysEnable", + "leftPath": "http://registry\\.gpii\\.net/common/slowKeysEnabled", "left": false, "right": false, "operator": "===" @@ -1952,7 +2006,7 @@ "true": { "transform": { "type": "fluid.transforms.condition", - "conditionPath": "http://registry\\.gpii\\.net/common/debounceEnable", + "conditionPath": "http://registry\\.gpii\\.net/common/debounceEnabled", "true": { "transform": { "type": "fluid.transforms.linearScale", @@ -1976,7 +2030,7 @@ } }, "inverseCapabilitiesTransformations": { - "http://registry\\.gpii\\.net/common/slowKeysEnable": { + "http://registry\\.gpii\\.net/common/slowKeysEnabled": { "transform": { "type": "fluid.transforms.condition", "condition": { @@ -2010,7 +2064,7 @@ } } }, - "http://registry\\.gpii\\.net/common/debounceEnable": { + "http://registry\\.gpii\\.net/common/debounceEnabled": { "transform": { "type": "fluid.transforms.condition", "condition": { @@ -2665,11 +2719,17 @@ "type": "gpii.launch.exec", "command": "C:\\Sociable\\Cloud4All.exe -stop" } + ], + "isRunning": [ + { + "type": "gpii.processReporter.find", + "command": "Cloud4Allcd " + } ] }, - "com.ilunion.cloud4chrome": { - "name": "Cloud4all Chrome extension", + "net.gpii.uioPlus": { + "name": "UIO+ Browser Extension", "contexts": { "OS": [{ "id": "win32", @@ -2677,70 +2737,106 @@ }] }, "settingsHandlers": { - "chromeconf": { + "configuration": { "type": "gpii.settingsHandlers.webSockets", "options": { - "path": "com.ilunion.cloud4chrome" + "path": "net.gpii.uioPlus" }, - "capabilities": [], + "capabilities": [ + "http://registry\\.gpii\\.net/common/lineSpace", + "http://registry\\.gpii\\.net/common/fontSize", + "http://registry\\.gpii\\.net/common/characterSpace", + "http://registry\\.gpii\\.net/common/inputsLargerEnabled", + "http://registry\\.gpii\\.net/common/highContrastEnabled", + "http://registry\\.gpii\\.net/common/highContrastTheme", + "http://registry\\.gpii\\.net/common/selfVoicingEnabled", + "http://registry\\.gpii\\.net/common/highlightColor", + "http://registry\\.gpii\\.net/common/tableOfContents", + "http://registry\\.gpii\\.net/common/supportTool", + "http://registry\\.gpii\\.net/common/simplifiedUiEnabled" + ], "capabilitiesTransformations": { - "screenReaderTTSEnabled": "http://registry\\.gpii\\.net/common/screenReaderTTSEnabled", + "lineSpace": "http://registry\\.gpii\\.net/common/lineSpace", "fontSize": { "transform": { - "type": "fluid.transforms.quantize", - "inputPath": "http://registry\\.gpii\\.net/common/fontSize", - "input": 9, - "ranges": [ - { - "upperBound": 12, - "output": "medium" - }, - { - "upperBound": 18, - "output": "large" - }, - { - "output": "x-large" + "type": "fluid.transforms.round", + "scale": 1, + "input": { + "transform": { + "type": "fluid.transforms.binaryOp", + "leftPath": "http://registry\\.gpii\\.net/common/fontSize", + "right": 12, + "operator": "/" } - ] + } } }, - "magnifierEnabled": "http://registry\\.gpii\\.net/common/magnifierEnabled", - "magnification": { + "characterSpace": "http://registry\\.gpii\\.net/common/characterSpace", + "inputsLargerEnabled": "http://registry\\.gpii\\.net/common/inputsLargerEnabled", + "contrastTheme": { "transform": { - "type": "fluid.transforms.quantize", - "inputPath": "http://registry\\.gpii\\.net/common/magnification", - "input": 1, - "ranges": [ - { - "upperBound": 1.2, - "output": 1 - }, - { - "upperBound": 2.5, - "output": 2 + "type": "fluid.transforms.condition", + "conditionPath": "http://registry\\.gpii\\.net/common/highContrastEnabled", + "true": { + "transform": { + "type": "fluid.transforms.valueMapper", + "defaultInputPath": "http://registry\\.gpii\\.net/common/highContrastTheme", + "defaultOutputValue": "default", + "match": { + "black-white": "bw", + "white-black": "wb", + "black-yellow": "by", + "yellow-black": "yb" + } + } + }, + "false": "default" + } + }, + "selfVoicingEnabled": "http://registry\\.gpii\\.net/common/selfVoicingEnabled", + "selectionTheme": "http://registry\\.gpii\\.net/common/highlightColor", + "tableOfContents": "http://registry\\.gpii\\.net/common/tableOfContents", + "dictionaryEnabled": { + "transform": { + "type": "fluid.transforms.valueMapper", + "match": [{ + "inputValue": { + "dictionaryEnabled": true }, - { - "output": 3 + "outputValue": true + }], + "noMatch": { + "outputValue": false + }, + "defaultInput": { + "transform": { + "type": "fluid.transforms.arrayToSetMembership", + "inputPath": "http://registry\\.gpii\\.net/common/supportTool", + "options": { + "dictionary": "dictionaryEnabled" + } } - ] + } } }, - "highContrastEnabled": "http://registry\\.gpii\\.net/common/highContrastEnabled", - "highContrastTheme": "http://registry\\.gpii\\.net/common/highContrastTheme", - "invertColours": "http://registry\\.gpii\\.net/common/invertColours" + "simplifiedUiEnabled": "http://registry\\.gpii\\.net/common/simplifiedUiEnabled", + "syllabificationEnabled": "http://registry\\.gpii\\.net/common/syllabificationEnabled" }, "inverseCapabilitiesTransformations": {} } }, "configure": [ - "settings.chromeconf" + "settings.configuration" ], "restore": [ - "settings.chromeconf" + "settings.configuration" ], "start": [], "stop": [], - "isInstalled": [] // always reported as not installed. Should be changed once GPII-1998 is fixed + "isInstalled": [ + { + "type": "gpii.deviceReporter.alwaysInstalled" + } + ] } } diff --git a/tests/ContextIntegrationTests.js b/tests/ContextIntegrationTests.js index bafdbab73..513f00ffc 100644 --- a/tests/ContextIntegrationTests.js +++ b/tests/ContextIntegrationTests.js @@ -23,7 +23,7 @@ var fluid = require("infusion"), fluid.registerNamespace("gpii.tests.contextIntegration"); -require("../index.js"); +fluid.require("%universal"); gpii.loadTestingSupport(); diff --git a/tests/DevelopmentTests.js b/tests/DevelopmentTests.js index ece9a0754..f8b69397a 100644 --- a/tests/DevelopmentTests.js +++ b/tests/DevelopmentTests.js @@ -20,7 +20,7 @@ var fluid = require("infusion"), gpii = fluid.registerNamespace("gpii"), kettle = fluid.registerNamespace("kettle"); -require("../index.js"); +fluid.require("%universal"); require("./shared/DevelopmentTestDefs.js"); gpii.loadTestingSupport(); diff --git a/tests/DeviceReporterErrorTests.js b/tests/DeviceReporterErrorTests.js index 3bcc17d02..e1f27e957 100644 --- a/tests/DeviceReporterErrorTests.js +++ b/tests/DeviceReporterErrorTests.js @@ -20,7 +20,7 @@ var fluid = require("infusion"), gpii = fluid.registerNamespace("gpii"), kettle = fluid.registerNamespace("kettle"); -require("../index.js"); +fluid.require("%universal") gpii.loadTestingSupport(); diff --git a/tests/IntegrationTests.js b/tests/IntegrationTests.js index d850633b3..3916cf740 100644 --- a/tests/IntegrationTests.js +++ b/tests/IntegrationTests.js @@ -25,7 +25,7 @@ fluid.contextAware.makeChecks({ } }); -require("../index.js"); +fluid.require("%universal"); gpii.loadTestingSupport(); diff --git a/tests/JournalIntegrationTests.js b/tests/JournalIntegrationTests.js index 4e8cb9ce2..cedc34098 100644 --- a/tests/JournalIntegrationTests.js +++ b/tests/JournalIntegrationTests.js @@ -18,7 +18,7 @@ var fluid = require("infusion"), jqUnit = fluid.registerNamespace("jqUnit"), gpii = fluid.registerNamespace("gpii"); -require("../index.js"); +fluid.require("%universal"); gpii.loadTestingSupport(); fluid.setLogging(true); diff --git a/tests/PayloadSizeTest.js b/tests/PayloadSizeTest.js new file mode 100644 index 000000000..20bb06269 --- /dev/null +++ b/tests/PayloadSizeTest.js @@ -0,0 +1,57 @@ +/* + * GPII-1880 Test Definitions + * + * Copyright 2017 Raising The Floor - International + * + * Licensed under the New BSD license. You may not use this file except in + * compliance with this License. + * + * You may obtain a copy of the License at + * https://github.com/GPII/universal/blob/master/LICENSE.txt + */ + +"use strict"; + +var fluid = require("infusion"), + jqUnit = fluid.require("node-jqunit", require, "jqUnit"), + gpii = fluid.registerNamespace("gpii"), + kettle = fluid.registerNamespace("kettle"); + +fluid.require("%universal") + +gpii.loadTestingSupport(); + +fluid.registerNamespace("gpii.tests.payloadSize"); + +gpii.tests.payloadSize.testLoginResponse = function (data) { + jqUnit.assertEquals("Response is correct", "User with token giant was successfully logged in.", data); +}; + +gpii.tests.payloadSize.testLogoutResponse = function (data) { + jqUnit.assertEquals("Response is correct", "User with token giant was successfully logged out.", data); +}; + +gpii.tests.payloadSize.testDefs = [{ + name: "Payload size limit tests > 100kb", + expect: 2, + config: { + configName: "gpii.tests.acceptance.localInstall.config", + configPath: "%universal/tests/configs" + }, + gradeNames: ["gpii.test.common.testCaseHolder"], + userToken: "giant", + + sequence: [{ + func: "{loginRequest}.send" + }, { + event: "{loginRequest}.events.onComplete", + listener: "gpii.tests.payloadSize.testLoginResponse" + }, { + func: "{logoutRequest}.send" + }, { + event: "{logoutRequest}.events.onComplete", + listener: "gpii.tests.payloadSize.testLogoutResponse" + }] +}]; + +kettle.test.bootstrapServer(fluid.copy(gpii.tests.payloadSize.testDefs)); diff --git a/tests/PreferencesServerErrorTests.js b/tests/PreferencesServerErrorTests.js index 65c1c27eb..a33ae4937 100644 --- a/tests/PreferencesServerErrorTests.js +++ b/tests/PreferencesServerErrorTests.js @@ -20,7 +20,7 @@ var fluid = require("infusion"), gpii = fluid.registerNamespace("gpii"), kettle = fluid.registerNamespace("kettle"); -require("../index.js"); +fluid.require("%universal"); gpii.loadTestingSupport(); diff --git a/tests/StartupAPITests.js b/tests/StartupAPITests.js index 959f302bd..6dd8b7d3a 100644 --- a/tests/StartupAPITests.js +++ b/tests/StartupAPITests.js @@ -17,7 +17,7 @@ https://github.com/GPII/universal/blob/master/LICENSE.txt jqUnit = fluid.registerNamespace("jqUnit"), gpii = fluid.registerNamespace("gpii"); - require("../index.js"); + fluid.require("%universal"); kettle.loadTestingSupport(); fluid.setLogging(true); diff --git a/tests/UntrustedDevelopmentTests.js b/tests/UntrustedDevelopmentTests.js index ec4465248..3f599b6c5 100644 --- a/tests/UntrustedDevelopmentTests.js +++ b/tests/UntrustedDevelopmentTests.js @@ -20,7 +20,7 @@ var fluid = require("infusion"), gpii = fluid.registerNamespace("gpii"), kettle = fluid.registerNamespace("kettle"); -require("../index.js"); +fluid.require("%universal"); require("./shared/DevelopmentTestDefs.js"); gpii.loadTestingSupport(); diff --git a/tests/all-tests.js b/tests/all-tests.js index 8880106d1..8d18206ea 100644 --- a/tests/all-tests.js +++ b/tests/all-tests.js @@ -50,6 +50,7 @@ var testIncludes = [ "./StartupAPITests.js", "./UntrustedBrowserChannelTests.js", "./UntrustedDevelopmentTests.js", + "./PayloadSizeTest.js", "./UntrustedUserLogonStateChangeTests.js", "../gpii/node_modules/flowManager/test/SaveTests.js", "../gpii/node_modules/flowManager/test/UpdateTests.js", @@ -70,6 +71,7 @@ var testIncludes = [ "../gpii/node_modules/ontologyHandler/test/node/OntologyHandlerTests.js", "../gpii/node_modules/contextManager/test/ContextManagerTests.js", "../gpii/node_modules/singleInstance/test/SingleInstanceTests.js", + "../gpii/node_modules/eventLog/test/EventLogTests.js", "../gpii/node_modules/deviceReporter/test/all-tests.js" ]; diff --git a/tests/platform/index-linux.js b/tests/platform/index-linux.js index 87366ccb7..7e9e9788d 100644 --- a/tests/platform/index-linux.js +++ b/tests/platform/index-linux.js @@ -23,7 +23,7 @@ https://github.com/GPII/universal/blob/master/LICENSE.txt module.exports = [ "linux/linux-builtIn-testSpec.js", "linux/linux-orca-testSpec.js", - "linux/linux-chrome-testSpec.js", + "linux/linux-uioPlus-testSpec.js", "linux/linux-dynamicDeviceReporter-testSpec.js", "linux/linux-xrandr-testSpec.js" ]; diff --git a/tests/platform/index-windows.js b/tests/platform/index-windows.js index 4f2ac99a6..7857ccc73 100644 --- a/tests/platform/index-windows.js +++ b/tests/platform/index-windows.js @@ -26,7 +26,7 @@ module.exports = [ "windows/windows-jaws-testSpec.js", "windows/windows-nvda-testSpec.js", "windows/windows-maavis-testSpec.js", - "windows/windows-chrome-testSpec.js", + "windows/windows-uioPlus-testSpec.js", "windows/windows-readWrite-testSpec.js", "windows/windows-dynamicDeviceReporter-testSpec.js" ]; diff --git a/tests/platform/linux/configs/gpii.tests.acceptance.linux.chrome.config.txt b/tests/platform/linux/configs/gpii.tests.acceptance.linux.chrome.config.txt deleted file mode 100644 index 5a536ac33..000000000 --- a/tests/platform/linux/configs/gpii.tests.acceptance.linux.chrome.config.txt +++ /dev/null @@ -1,8 +0,0 @@ -This configuration file is used for testing the chrome extension in Linux - -It includes to the basic localInstall setup for acceptance tests (modifying the -preferences folder used), which in turn includes the standard development -config file (running GPII locally, using development setup). - -This config sets the device reporter file to be 'chrome.json', which will report -the Cloud4all Chrome extension for Google Chrome as being installed on the system. diff --git a/tests/platform/linux/configs/gpii.tests.acceptance.linux.chrome.config.json b/tests/platform/linux/configs/gpii.tests.acceptance.linux.uioPlus.config.json similarity index 82% rename from tests/platform/linux/configs/gpii.tests.acceptance.linux.chrome.config.json rename to tests/platform/linux/configs/gpii.tests.acceptance.linux.uioPlus.config.json index eb9e07bfe..75c92bfc2 100644 --- a/tests/platform/linux/configs/gpii.tests.acceptance.linux.chrome.config.json +++ b/tests/platform/linux/configs/gpii.tests.acceptance.linux.uioPlus.config.json @@ -1,13 +1,13 @@ { - "type": "gpii.tests.acceptance.linux.chrome.config", + "type": "gpii.tests.acceptance.linux.uioPlus.config", "options": { "distributeOptions": { "acceptance.installedSolutionsPath": { - "record": "%universal/testData/deviceReporter/acceptanceTests/chrome.json", + "record": "%universal/testData/deviceReporter/acceptanceTests/uioPlus.json", "target": "{that deviceReporter installedSolutionsDataSource}.options.path", "priority": "after:development.installedSolutionsPath" } } - }, + }, "mergeConfigs": "%universal/tests/configs/gpii.tests.acceptance.localInstall.config.json" } diff --git a/tests/platform/linux/configs/gpii.tests.acceptance.linux.uioPlus.config.txt b/tests/platform/linux/configs/gpii.tests.acceptance.linux.uioPlus.config.txt new file mode 100644 index 000000000..5e4511545 --- /dev/null +++ b/tests/platform/linux/configs/gpii.tests.acceptance.linux.uioPlus.config.txt @@ -0,0 +1,8 @@ +This configuration file is used for testing the browser extension in Linux + +It includes to the basic localInstall setup for acceptance tests (modifying the +preferences folder used), which in turn includes the standard development +config file (running GPII locally, using development setup). + +This config sets the device reporter file to be 'uioPlus.json', which will report +the UIO Plus browser extension as being installed on the system. diff --git a/tests/platform/linux/linux-chrome-testSpec.js b/tests/platform/linux/linux-chrome-testSpec.js deleted file mode 100644 index 46dd95da5..000000000 --- a/tests/platform/linux/linux-chrome-testSpec.js +++ /dev/null @@ -1,108 +0,0 @@ -/* -GPII Integration and Acceptance Testing - -Copyright 2014 Emergya - -Licensed under the New BSD license. You may not use this file except in -compliance with this License. - -You may obtain a copy of the License at -https://github.com/GPII/universal/blob/master/LICENSE.txt - -The research leading to these results has received funding from the European Union's -Seventh Framework Programme (FP7/2007-2013) under grant agreement no. 289016. -*/ - -"use strict"; - -var fluid = require("infusion"), - gpii = fluid.registerNamespace("gpii"); - -fluid.require("%universal"); - -gpii.loadTestingSupport(); - -fluid.registerNamespace("gpii.tests.linux.chrome"); - -gpii.tests.linux.chrome.testDefs = [ - { - name: "Acceptance test for background color change in Chrome", - userToken: "chrome_high_contrast", - settingsHandlers: { - "gpii.settingsHandlers.webSockets": { - "data": [ - { - "settings": { - "fontSize": "medium", - "invertColours": false, - "magnifierEnabled": false, - "magnification": 1, - "highContrastTheme": "white-black", - "highContrastEnabled": true, - "screenReaderTTSEnabled": false - }, - "options": { - "path": "com.ilunion.cloud4chrome" - } - } - ] - } - }, - processes: [] - }, - { - name: "Acceptance test for font size transformation in Chrome", - userToken: "chrome_font_size", - settingsHandlers: { - "gpii.settingsHandlers.webSockets": { - "data": [ - { - "settings": { - "fontSize": "large", - "invertColours": false, - "magnifierEnabled": false, - "magnification": 1, - "highContrastEnabled": false, - "screenReaderTTSEnabled": false - }, - "options": { - "path": "com.ilunion.cloud4chrome" - } - } - ] - } - }, - processes: [] - }, - { - name: "Acceptance test for magnification transformation in Chrome", - userToken: "chrome_magnification", - settingsHandlers: { - "gpii.settingsHandlers.webSockets": { - "data": [ - { - "settings": { - "fontSize": "medium", - "invertColours": false, - "magnifierEnabled": true, - "magnification": 2, - "highContrastEnabled": false, - "screenReaderTTSEnabled": false - }, - "options": { - "path": "com.ilunion.cloud4chrome" - } - } - ] - } - }, - processes: [] - } -]; - -module.exports = gpii.test.bootstrap({ - testDefs: "gpii.tests.linux.chrome.testDefs", - configName: "gpii.tests.acceptance.linux.chrome.config", - configPath: "%universal/tests/platform/linux/configs" -}, ["gpii.test.integration.testCaseHolder.linux"], - module, require, __dirname); diff --git a/tests/platform/linux/linux-chrome-testSpec.txt b/tests/platform/linux/linux-chrome-testSpec.txt deleted file mode 100644 index 9e9296df9..000000000 --- a/tests/platform/linux/linux-chrome-testSpec.txt +++ /dev/null @@ -1,11 +0,0 @@ -linux-chrome-testSpec.txt - -Descriptions: - -* Solution: Cloud4all's Chrome extension for Google Chrome (cloud4chrome) -* Configuration file: linux-chrome-config.json -* Device reporter file: chrome.json -* NP sets: - * chrome_high_contrast - * chrome_font_size - * chrome_magnification \ No newline at end of file diff --git a/tests/platform/linux/linux-uioPlus-testSpec.js b/tests/platform/linux/linux-uioPlus-testSpec.js new file mode 100644 index 000000000..3b03700d0 --- /dev/null +++ b/tests/platform/linux/linux-uioPlus-testSpec.js @@ -0,0 +1,32 @@ +/* +GPII Integration and Acceptance Testing + +Copyright 2014 Emergya +Copyright 2017 OCAD University + +Licensed under the New BSD license. You may not use this file except in +compliance with this License. + +You may obtain a copy of the License at +https://github.com/GPII/universal/blob/master/LICENSE.txt + +The research leading to these results has received funding from the European Union's +Seventh Framework Programme (FP7/2007-2013) under grant agreement no. 289016. +*/ + +"use strict"; + +var fluid = require("infusion"), + gpii = fluid.registerNamespace("gpii"); + +fluid.require("%universal"); +require("../shared/uioPlusTestDefs.js"); + +gpii.loadTestingSupport(); + +module.exports = gpii.test.bootstrap({ + testDefs: "gpii.tests.uioPlus.testDefs", + configName: "gpii.tests.acceptance.linux.uioPlus.config", + configPath: "%universal/tests/platform/linux/configs" +}, ["gpii.test.integration.testCaseHolder.linux"], + module, require, __dirname); diff --git a/tests/platform/linux/linux-uioPlus-testSpec.txt b/tests/platform/linux/linux-uioPlus-testSpec.txt new file mode 100644 index 000000000..f904ef913 --- /dev/null +++ b/tests/platform/linux/linux-uioPlus-testSpec.txt @@ -0,0 +1,19 @@ +linux-uioPlus-testSpec.txt + +Descriptions: + +* Solution: Browser extension (UIO Plus) +* Device reporter file: uioPlus.json +* NP sets: + * uioPlus_character_space + * uioPlus_font_size + * uioPlus_high_contrast + * uioPlus_highlight_colour + * uioPlus_inputs_larger + * uioPlus_line_space + * uioPlus_multiple_settings + * uioPlus_self_voicing + * uioPlus_simplified + * uioPlus_support_tool + * uioPlus_syllabification + * uioPlus_toc diff --git a/tests/platform/shared/uioPlusTestDefs.js b/tests/platform/shared/uioPlusTestDefs.js new file mode 100644 index 000000000..68f0fd864 --- /dev/null +++ b/tests/platform/shared/uioPlusTestDefs.js @@ -0,0 +1,459 @@ +/* +GPII Integration and Acceptance Testing + +Copyright 2017 OCAD University + +Licensed under the New BSD license. You may not use this file except in +compliance with this License. + +You may obtain a copy of the License at +https://github.com/GPII/universal/blob/master/LICENSE.txt + +The research leading to these results has received funding from the European Union's +Seventh Framework Programme (FP7/2007-2013) under grant agreement no. 289016. +*/ + +"use strict"; + +var fluid = require("infusion"), + gpii = fluid.registerNamespace("gpii"); + +fluid.registerNamespace("gpii.tests.uioPlus"); + +gpii.tests.uioPlus.testDefs = [ + { + name: "Acceptance test for default preferences in Browser Extension", + userToken: "uioPlus_defaults", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1, + "fontSize": 1, + "characterSpace": 0, + "inputsLargerEnabled": false, + "contrastTheme": "default", + "selfVoicingEnabled": false, + "selectionTheme": "default", + "tableOfContents": false, + "dictionaryEnabled": false, + "simplifiedUiEnabled": false, + "syllabificationEnabled": false + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for background color change in Browser Extension", + userToken: "uioPlus_high_contrast", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1, + "fontSize": 1, + "characterSpace": 0, + "inputsLargerEnabled": false, + "contrastTheme": "wb", + "selfVoicingEnabled": false, + "selectionTheme": "default", + "tableOfContents": false, + "dictionaryEnabled": false, + "simplifiedUiEnabled": false, + "syllabificationEnabled": false + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for font size transformation in Browser Extension", + userToken: "uioPlus_font_size", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1, + "fontSize": 2, + "characterSpace": 0, + "inputsLargerEnabled": false, + "contrastTheme": "default", + "selfVoicingEnabled": false, + "selectionTheme": "default", + "tableOfContents": false, + "dictionaryEnabled": false, + "simplifiedUiEnabled": false, + "syllabificationEnabled": false + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for line space transformation in Browser Extension", + userToken: "uioPlus_line_space", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 2, + "fontSize": 1, + "characterSpace": 0, + "inputsLargerEnabled": false, + "contrastTheme": "default", + "selfVoicingEnabled": false, + "selectionTheme": "default", + "tableOfContents": false, + "dictionaryEnabled": false, + "simplifiedUiEnabled": false, + "syllabificationEnabled": false + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for highlight color transformation in Browser Extension", + userToken: "uioPlus_highlight_colour", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1, + "fontSize": 1, + "characterSpace": 0, + "inputsLargerEnabled": false, + "contrastTheme": "default", + "selfVoicingEnabled": false, + "selectionTheme": "yellow", + "tableOfContents": false, + "dictionaryEnabled": false, + "simplifiedUiEnabled": false, + "syllabificationEnabled": false + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for character space transformation in Browser Extension", + userToken: "uioPlus_character_space", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1, + "fontSize": 1, + "characterSpace": 1, + "inputsLargerEnabled": false, + "contrastTheme": "default", + "selfVoicingEnabled": false, + "selectionTheme": "default", + "tableOfContents": false, + "dictionaryEnabled": false, + "simplifiedUiEnabled": false, + "syllabificationEnabled": false + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for inputs larger transformation in Browser Extension", + userToken: "uioPlus_inputs_larger", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1, + "fontSize": 1, + "characterSpace": 0, + "inputsLargerEnabled": true, + "contrastTheme": "default", + "selfVoicingEnabled": false, + "selectionTheme": "default", + "tableOfContents": false, + "dictionaryEnabled": false, + "simplifiedUiEnabled": false, + "syllabificationEnabled": false + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for self voicing transformation in Browser Extension", + userToken: "uioPlus_self_voicing", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1, + "fontSize": 1, + "characterSpace": 0, + "inputsLargerEnabled": false, + "contrastTheme": "default", + "selfVoicingEnabled": true, + "selectionTheme": "default", + "tableOfContents": false, + "dictionaryEnabled": false, + "simplifiedUiEnabled": false, + "syllabificationEnabled": false + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for table of contents transformation in Browser Extension", + userToken: "uioPlus_toc", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1, + "fontSize": 1, + "characterSpace": 0, + "inputsLargerEnabled": false, + "contrastTheme": "default", + "selfVoicingEnabled": false, + "selectionTheme": "default", + "tableOfContents": true, + "dictionaryEnabled": false, + "simplifiedUiEnabled": false, + "syllabificationEnabled": false + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for dictionary transformation in Browser Extension", + userToken: "uioPlus_support_tool", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1, + "fontSize": 1, + "characterSpace": 0, + "inputsLargerEnabled": false, + "contrastTheme": "default", + "selfVoicingEnabled": false, + "selectionTheme": "default", + "tableOfContents": false, + "dictionaryEnabled": true, + "simplifiedUiEnabled": false, + "syllabificationEnabled": false + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for support tool transformation in Browser Extension - multiple values", + userToken: "uioPlus_multiple_support_tool", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1, + "fontSize": 1, + "characterSpace": 0, + "inputsLargerEnabled": false, + "contrastTheme": "default", + "selfVoicingEnabled": false, + "selectionTheme": "default", + "tableOfContents": false, + "dictionaryEnabled": true, + "simplifiedUiEnabled": false, + "syllabificationEnabled": false + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for support tool transformation in Browser Extension - unsupported values", + userToken: "uioPlus_unhandled_support_tool", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1, + "fontSize": 1, + "characterSpace": 0, + "inputsLargerEnabled": false, + "contrastTheme": "default", + "selfVoicingEnabled": false, + "selectionTheme": "default", + "tableOfContents": false, + "dictionaryEnabled": false, + "simplifiedUiEnabled": false, + "syllabificationEnabled": false + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for simplified UI transformation in Browser Extension", + userToken: "uioPlus_simplified", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1, + "fontSize": 1, + "characterSpace": 0, + "inputsLargerEnabled": false, + "contrastTheme": "default", + "selfVoicingEnabled": false, + "selectionTheme": "default", + "tableOfContents": false, + "dictionaryEnabled": false, + "simplifiedUiEnabled": true, + "syllabificationEnabled": false + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for syllabification UI transformation in Browser Extension", + userToken: "uioPlus_syllabification", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1, + "fontSize": 1, + "characterSpace": 0, + "inputsLargerEnabled": false, + "contrastTheme": "default", + "selfVoicingEnabled": false, + "selectionTheme": "default", + "tableOfContents": false, + "dictionaryEnabled": false, + "simplifiedUiEnabled": false, + "syllabificationEnabled": true + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + }, + { + name: "Acceptance test for multiple transformations in Browser Extension", + userToken: "uioPlus_multiple_settings", + settingsHandlers: { + "gpii.settingsHandlers.webSockets": { + "data": [ + { + "settings": { + "lineSpace": 1.3, + "fontSize": 1.3, + "characterSpace": 2, + "inputsLargerEnabled": true, + "contrastTheme": "yb", + "selfVoicingEnabled": true, + "selectionTheme": "green", + "tableOfContents": true, + "dictionaryEnabled": true, + "simplifiedUiEnabled": true, + "syllabificationEnabled": true + }, + "options": { + "path": "net.gpii.uioPlus" + } + } + ] + } + }, + processes: [] + } +]; diff --git a/tests/platform/windows/configs/gpii.tests.acceptance.windows.chrome.config.txt b/tests/platform/windows/configs/gpii.tests.acceptance.windows.chrome.config.txt deleted file mode 100644 index 02a8388b4..000000000 --- a/tests/platform/windows/configs/gpii.tests.acceptance.windows.chrome.config.txt +++ /dev/null @@ -1,8 +0,0 @@ -This configuration file is used for testing the chrome extension in Windows - -It includes to the basic localInstall setup for acceptance tests (modifying the -preferences folder used), which in turn includes the standard development -config file (running GPII locally, using development setup). - -This config sets the device reporter file to be 'chrome.json', which will report -the Cloud4all Chrome extension for Google Chrome as being installed on the system. diff --git a/tests/platform/windows/configs/gpii.tests.acceptance.windows.chrome.config.json b/tests/platform/windows/configs/gpii.tests.acceptance.windows.uioPlus.config.json similarity index 82% rename from tests/platform/windows/configs/gpii.tests.acceptance.windows.chrome.config.json rename to tests/platform/windows/configs/gpii.tests.acceptance.windows.uioPlus.config.json index a901f51a9..47ffbbc6a 100644 --- a/tests/platform/windows/configs/gpii.tests.acceptance.windows.chrome.config.json +++ b/tests/platform/windows/configs/gpii.tests.acceptance.windows.uioPlus.config.json @@ -1,13 +1,13 @@ { - "type": "gpii.tests.acceptance.windows.chrome", + "type": "gpii.tests.acceptance.windows.uioPlus", "options": { "distributeOptions": { "acceptance.installedSolutionsPath": { - "record": "%universal/testData/deviceReporter/acceptanceTests/chrome.json", + "record": "%universal/testData/deviceReporter/acceptanceTests/uioPlus.json", "target": "{that deviceReporter installedSolutionsDataSource}.options.path", "priority": "after:development.installedSolutionsPath" } } - }, + }, "mergeConfigs": "%universal/tests/configs/gpii.tests.acceptance.localInstall.config.json" } diff --git a/tests/platform/windows/configs/gpii.tests.acceptance.windows.uioPlus.config.txt b/tests/platform/windows/configs/gpii.tests.acceptance.windows.uioPlus.config.txt new file mode 100644 index 000000000..1ca2942b6 --- /dev/null +++ b/tests/platform/windows/configs/gpii.tests.acceptance.windows.uioPlus.config.txt @@ -0,0 +1,8 @@ +This configuration file is used for testing the browser extension in Windows + +It includes to the basic localInstall setup for acceptance tests (modifying the +preferences folder used), which in turn includes the standard development +config file (running GPII locally, using development setup). + +This config sets the device reporter file to be 'uioPlus.json', which will report +the UIO Plus extension as being installed on the system. diff --git a/tests/platform/windows/windows-chrome-testSpec.js b/tests/platform/windows/windows-chrome-testSpec.js deleted file mode 100644 index bc66b41ae..000000000 --- a/tests/platform/windows/windows-chrome-testSpec.js +++ /dev/null @@ -1,110 +0,0 @@ -/* -GPII Integration and Acceptance Testing - -Copyright 2014 Emergya - -Licensed under the New BSD license. You may not use this file except in -compliance with this License. - -You may obtain a copy of the License at -https://github.com/GPII/universal/blob/master/LICENSE.txt - -The research leading to these results has received funding from the European Union's -Seventh Framework Programme (FP7/2007-2013) under grant agreement no. 289016. -*/ - -"use strict"; - -var fluid = require("infusion"), - gpii = fluid.registerNamespace("gpii"); - -fluid.require("%universal"); - -gpii.loadTestingSupport(); - -fluid.registerNamespace("gpii.tests.windows.chrome"); - - - -gpii.tests.windows.chrome = [ - { - name: "Acceptance test for background color change in Chrome", - userToken: "chrome_high_contrast", - settingsHandlers: { - "gpii.settingsHandlers.webSockets": { - "data": [ - { - "settings": { - "fontSize": "medium", - "invertColours": false, - "magnifierEnabled": false, - "magnification": 1, - "highContrastTheme": "white-black", - "highContrastEnabled": true, - "screenReaderTTSEnabled": false - }, - "options": { - "path": "com.ilunion.cloud4chrome" - } - } - ] - } - }, - processes: [] - }, - { - name: "Acceptance test for font size transformation in Chrome", - userToken: "chrome_font_size", - settingsHandlers: { - "gpii.settingsHandlers.webSockets": { - "data": [ - { - "settings": { - "fontSize": "large", - "invertColours": false, - "magnifierEnabled": false, - "magnification": 1, - "highContrastEnabled": false, - "screenReaderTTSEnabled": false - }, - "options": { - "path": "com.ilunion.cloud4chrome" - } - } - ] - } - }, - processes: [] - }, - { - name: "Acceptance test for magnification transformation in Chrome", - userToken: "chrome_magnification", - settingsHandlers: { - "gpii.settingsHandlers.webSockets": { - "data": [ - { - "settings": { - "fontSize": "medium", - "invertColours": false, - "magnifierEnabled": true, - "magnification": 2, - "highContrastEnabled": false, - "screenReaderTTSEnabled": false - }, - "options": { - "path": "com.ilunion.cloud4chrome" - } - } - ] - } - }, - processes: [] - } -]; - -module.exports = gpii.test.bootstrap({ - testDefs: "gpii.tests.windows.chrome", - configName: "gpii.tests.acceptance.windows.chrome.config", - configPath: "%universal/tests/platform/windows/configs" -}, ["gpii.test.integration.testCaseHolder.windows"], - module, require, __dirname); diff --git a/tests/platform/windows/windows-chrome-testSpec.txt b/tests/platform/windows/windows-chrome-testSpec.txt deleted file mode 100644 index 8315d6415..000000000 --- a/tests/platform/windows/windows-chrome-testSpec.txt +++ /dev/null @@ -1,11 +0,0 @@ -windows-chrome-testSpec.txt - -Descriptions: - -* Solution: Cloud4all's Chrome extension for Google Chrome (cloud4chrome) -* Configuration file: windows-chrome-config.json -* Device reporter file: chrome.json -* NP sets: - * chrome_high_contrast - * chrome_font_size - * chrome_magnification \ No newline at end of file diff --git a/tests/platform/windows/windows-uioPlus-testSpec.js b/tests/platform/windows/windows-uioPlus-testSpec.js new file mode 100644 index 000000000..9fa24af7a --- /dev/null +++ b/tests/platform/windows/windows-uioPlus-testSpec.js @@ -0,0 +1,32 @@ +/* +GPII Integration and Acceptance Testing + +Copyright 2014 Emergya +Copyright 2017 OCAD University + +Licensed under the New BSD license. You may not use this file except in +compliance with this License. + +You may obtain a copy of the License at +https://github.com/GPII/universal/blob/master/LICENSE.txt + +The research leading to these results has received funding from the European Union's +Seventh Framework Programme (FP7/2007-2013) under grant agreement no. 289016. +*/ + +"use strict"; + +var fluid = require("infusion"), + gpii = fluid.registerNamespace("gpii"); + +fluid.require("%universal"); +require("../shared/uioPlusTestDefs.js"); + +gpii.loadTestingSupport(); + +module.exports = gpii.test.bootstrap({ + testDefs: "gpii.tests.uioPlus.testDefs", + configName: "gpii.tests.acceptance.windows.uioPlus.config", + configPath: "%universal/tests/platform/windows/configs" +}, ["gpii.test.integration.testCaseHolder.windows"], + module, require, __dirname); diff --git a/tests/platform/windows/windows-uioPlus-testSpec.txt b/tests/platform/windows/windows-uioPlus-testSpec.txt new file mode 100644 index 000000000..230396566 --- /dev/null +++ b/tests/platform/windows/windows-uioPlus-testSpec.txt @@ -0,0 +1,19 @@ +windows-uioPlus-testSpec.txt + +Descriptions: + +* Solution: Browser extension (UIO Plus) +* Device reporter file: uioPlus.json +* NP sets: + * uioPlus_character_space + * uioPlus_font_size + * uioPlus_high_contrast + * uioPlus_highlight_colour + * uioPlus_inputs_larger + * uioPlus_line_space + * uioPlus_multiple_settings + * uioPlus_self_voicing + * uioPlus_simplified + * uioPlus_support_tool + * uioPlus_syllabification + * uioPlus_toc diff --git a/tests/web/html/all-tests.html b/tests/web/html/all-tests.html index d59767bed..1b9c00100 100644 --- a/tests/web/html/all-tests.html +++ b/tests/web/html/all-tests.html @@ -25,7 +25,9 @@ "../../../gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/test/html/AuthorizationServiceTests.html", "../../../gpii/node_modules/gpii-oauth2/gpii-oauth2-authz-server/test/html/UserServiceTests.html", "../../../gpii/node_modules/gpii-oauth2/gpii-oauth2-datastore/test/html/DataSource-PouchDBTests.html", - "../../../gpii/node_modules/gpii-oauth2/gpii-oauth2-utilities/test/html/OAuth2UtilitiesTests.html" + "../../../gpii/node_modules/gpii-oauth2/gpii-oauth2-utilities/test/html/OAuth2UtilitiesTests.html", + "../../../gpii/node_modules/processReporter/test/web/html/ProcessesBridgeTest.html", + "../../../gpii/node_modules/processReporter/test/web/html/ProcessReporterTest.html" ]); QUnit.testSuites([ From e458383772a7c89a3bb021ec0681476178e05c2b Mon Sep 17 00:00:00 2001 From: Joseph Scheuhammer Date: Fri, 13 Oct 2017 13:13:24 -0400 Subject: [PATCH 5/5] GPII-1939: Fixed typo --- gpii/node_modules/deviceReporter/src/DeviceReporter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gpii/node_modules/deviceReporter/src/DeviceReporter.js b/gpii/node_modules/deviceReporter/src/DeviceReporter.js index eec4aec80..4014cd852 100644 --- a/gpii/node_modules/deviceReporter/src/DeviceReporter.js +++ b/gpii/node_modules/deviceReporter/src/DeviceReporter.js @@ -206,7 +206,7 @@ gpii.platformReporter.getBasicOS = function () { * and so on. * * @param that (Component) A platform reporter instance. - * @return (Object) An object that has properties describing platrform + * @return (Object) An object that has properties describing platform * features/capabilities; at least basic information such ss * the version of the OS. */